Express - 中间件

发布时间 2023-08-20 13:05:00作者: OrzMiku

中间件编写

中间件函数可以接受三个参数,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