中间件(Middleware)是一种钩入路由过程的函数,它在链中的某一点执行任意操作(取决于我们想要它执行的操作)。

中间件常用于编辑请求或响应对象,或在到达路由处理程序代码之前终止请求。

添加中间件到执行堆栈的方式如下:

app.use((req, res, next) => { /* */ })

这类似于定义路由,但除了请求和响应对象实例之外,我们还有一个对下一个中间件函数的引用,我们将其分配给变量 next

我们总是在我们的中间件函数的结尾调用 next(),以便将执行传递给下一个处理程序。除非我们想要提前结束响应并将其发送回客户端。

通常情况下,您会使用预先创建的中间件,以 npm 包的形式存在。可以在 这里 找到可用中间件的大列表。

一个例子是 cookie-parser,它用于将 cookie 解析为 req.cookies 对象。您可以使用 npm install cookie-parser 安装它,并如下使用:

const express = require('express')
const app = express()
const cookieParser = require('cookie-parser')

app.get('/', (req, res) => res.send('Hello World!'))

app.use(cookieParser())
app.listen(3000, () => console.log('Server ready'))

我们还可以将中间件函数设置为仅对特定路由运行(而非全部)。方法是将其作为路由定义的第二个参数:

const myMiddleware = (req, res, next) => {
  /* ... */
  next()
}

app.get('/', myMiddleware, (req, res) => res.send('Hello World!'))

如果您需要存储在中间件中生成的数据以将其传递到后续的中间件函数或请求处理程序中,可以使用 Request.locals 对象。它将该数据附加到当前请求:

req.locals.name = 'Flavio'