npm init 创建一个package.json npm install express --save-dev 安装到项目依赖 便于多人开发 路由结构定义 app.METHOD(PATH, HANDLER); 假定app是一个express的实例 app = express(); METHOD 是某个HTTP请求方式之一 PATH 是服务器端的路径 HANDLER 是当路由匹配到时 需要执行的函数 托管静态文件 图片 css js app.use(express.static("public")) 访问 localhost:3000/img/hha.png 将静态资源文件所在的目录作为参数传递给express.static中间件就可以提供静态资源文件了 可以多次使用 依次访问 app.use(express.static("public")) app.use(express.static("static")) 存放虚拟目录 app.use("/static", express.static("public")); 访问 localhost:3000/static/img/hha.png 路由详解 app.use("/", callback); 特殊的路由方法 没有一种http请求与其对应 作用 对于一个路径上的所有请求加载中间件 可以做一些基本的校验 路由路径 字符串路径请求 / 匹配根路径 /about 匹配/about路径请求 /random.text 匹配random.text路径请求 字符串模式路径请求 /ab?cd 匹配acd 和 abcd 问号 一个或者零个 /ab+cd 匹配abcd abbcd 加号 一个或者多个 /ab*cd 匹配abcd abxcd ab scjsf cd 等 * 任意字符 可以没有 /ab(cd)?e 匹配abe abcde 问号 一个或者零个 正则匹配路径 /a/ 匹配任何含有a的路路径 /.*fly$/ 匹配 $以fly结尾 *有或者没有字符 响应方法 响应对象的方法向客户端返回响应 终结请求响应的循环 不响应 客户端请求挂起直到请求超时 res.download() 提示下载文件 res.end() 终结响应处理流程 res.json() 发送一个JSON格式的响应 res.jsonp() 发红一个JSONP的JSON格式响应 res.redirect() 重定向请求 res.render() 渲染视图模版 res.send() 发送各种类型的响应 res.sendFile() 以八字节流的形式发送文件 res.sendStatus() 设置响应状态码 并将其以字符串的形式作为响应体的一部分发送 app.route() 创建链式路由 app.route("/book") .get(callback) .post(callback) .put(callback); express.Router 可用express.Router类创建模块化 可挂载的路由句柄 myapp 的router文件夹下birds.js 中间件 中间件是一个函数 可以访问 req res 和web中出于请求和响应环节流程中间的中间件 中间件如果没有终结请求-响应循环 必须调用next()方法将控制权交给下一个中间件 功能 执行任何代码 修改请求和响应对象 终结请求-响应循环 调用堆栈中的下一个中间件 中间件分类 应用级中间件 应用级中间件绑定到app对象 使用 app.use() app.METH() //没有挂在路径的中间件 应用的每个请求都会执行该中间件 app.use(function(req, res, next){}) //挂载到/user/:id的中间件 任何指向/user/:id的请求都会执行他 app.use("/user/:id", function(req, res, next){}) //路由和句柄函数(中间件系统), 处理指向/user/:id的get请求 app.get("/user/:id", function(req, res, next){}) 如果需要在中间件中跳过剩余中间件 可调用next("route")方法将控制权交给下一个路由 路由中间件 效果和应用中间件相同 next("route") //跳过中间件 跳到下一个路由 错误处理中间件 四个参数 err, req, res, next 必须是四个参数 不然会认为是普通中间件 内置中间件 只有一个 express.static(root, [option]) 应用可以设置多个静态目录 option 是一个对象 拥有如下属性 dotfiles: 是否对外输出文件以(.)开头的文件 可选值 allow deny ignore etag: 是否启动etag生成 extensions: 设置文件扩展名备份选项 index: 发送目录文件索引 设置为false时禁用目录索引 lastModified: 设置last-Modified头为文件在操作系统上的最后修改日期 值为 boolean maxAge: 以毫秒或字符串格式设置 Cache-Contorl头的max-age属性 redirect: 当路径为目录时 重定向dao/ setHeaders: 设置HTTP头以提供文件的函数 第三方中间件 var cookieParser = require("cookie-parser 加载用于解析cookie的中间件 app.use(cookieParser()); 模版引擎 需要设置views view engine才能让Express渲染模版引擎 views 放模版文件的目录 app.set("views", "./views") view engine 模版引擎 app.set("view engine", "jade") 安装模版引擎npm软件包 npm install jade --save-dev view engine 设置成功之后 就不需要指定引擎 或者应用中加载模版引擎模块 app.set("view engine", "jade"); index.jade html head title!= title body h1 #{title} 创建一个路由渲染index.jade文件 如果没有设置 view engine 需要指明视图文件的后缀 否者会遗漏 app.get("/", function(req, res){ res.render("index", {title:"express jade"}); }) 错误处理 app.use(logErrors); next() app.use(clientErrorHandler); next() app.use(errorHandler); 调试Express DEBUG=express:* node index.js 可以查看所有日志 DEBUG=express:router 只查看路由部分的日志 DEBUG=express:application 只查看应用部分的日志 DEBUG=http,mail,express:* node index.js 通过逗号隔开的名字列表来指定多个调试命名空间 注意: 中间件(路由 应用中间件)如果没有终结请求-响应循环 必须调用next()方法将控制权交给下一个中间件