中间件编写
中间件函数可以接受三个参数,req(请求),res(响应)和next(下一个中间件函数)。
如果这个中间件不结束请求/响应循环,就需要调用next函数。先装载的中间件函数会被先执行,如果忘记调用next函数,会导致后装载的中间件被忽略。
使用中间件
应用层中间件
可以使用 app.use()
和 app.METHOD()
将中间件绑定至应用程序实例,
这是一个没有指定路由的例子,应用程序每次收到请求时执行该函数。
var app = express();
app.use(function (req, res, next) {
console.log('Time:', Date.now());
next();
});
这是一个安装在 /user/:id 路径中的中间件函数。在 /user/:id 路径中为任何类型的 HTTP 请求执行此函数。
app.use('/user/:id', function (req, res, next) {
console.log('Request Type:', req.method);
next();
});
这是一个安装在 /user/:id 路径中的中间件函数。在 /user/:id 路径中为 GET 请求执行此函数。
app.get('/user/:id', function (req, res, next) {
console.log('Request Type: GET');
next();
});
你可以在一个
app.use()
或app.METHOD()
传入多个中间件函数,或者传入一组中间件函数,他们会按照载入顺序执行。
路由器层中间件
路由器层中间件的工作方式与应用层中间件基本相同,差异之处在于它绑定到 express.Router() 的实例。
下面是一个简单的例子:
var express = require("express");
var router = express.Router();
/* GET home page. */
router.get("/", function (req, res, next) {
res.render("index", { title: "Express" });
});
router.get("/test", function (req, res, next) {
res.render("layout", { title: "Test Page", content: "测试页面" });
});
module.exports = router;
错误处理中间件
与普通中间件不同是的,错误处理中间件必须传入四个参数,即使某个参数用不到。按照参数顺序,分别是err,req,res,next。
app.use(function(err, req, res, next) {
console.error(err.stack);
res.status(500).send('Something broke!');
});
注意,错误处理中间件应当在最后定义。
如果将错误传递到 next() 且未在错误处理程序中进行处理,那么该错误将由内置的错误处理程序处理;
内置中间件
Express 中唯一内置的中间件函数是 express.static。用于处理静态资源。在之前的文章中简单介绍过这个函数的使用方法。在这里具体介绍一下。
express.static(root, [options])
root 自变量指定从其中提供静态资源的根目录。
可选的 options 对象可以具有以下属性:
属性 | 描述 | 类型 | 缺省值 |
---|---|---|---|
dotfiles | 是否对外输出文件名以点(.)开头的文件。有效值包括“allow”、“deny”和“ignore” | 字符串 | “ignore” |
etag | 启用或禁用 etag 生成 | 布尔 | true |
extensions | 用于设置后备文件扩展名。 | 数组 | [] |
index | 发送目录索引文件。设置为 false 可禁用建立目录索引。 | 混合 | “index.html” |
lastModified | 将 Last-Modified 的头设置为操作系统上该文件的上次修改日期。有效值包括 true 或 false。 | 布尔 | true |
maxAge | 设置 Cache-Control 头的 max-age 属性(以毫秒或者 ms 格式中的字符串为单位) | 数字 | 0 |
redirect | 当路径名是目录时重定向到结尾的“/”。 | 布尔 | true |
setHeaders | 用于设置随文件一起提供的 HTTP 头的函数。 | 函数 |
下面是一个例子:
var options = {
dotfiles: 'ignore',
etag: false,
extensions: ['htm', 'html'],
index: false,
maxAge: '1d',
redirect: false,
setHeaders: function (res, path, stat) {
res.set('x-timestamp', Date.now());
}
}
app.use(express.static('public', options));
第三方中间件
除了自己编写中间件和使用内置中间件,你也可以使用包管理器安装一些第三方提供的中间件函数,然后在Express使用。
常见的第三方中间件列表:https://expressjs.com/en/resources/middleware.html