编写中间件
中间件函数是可以访问请求对象(req)、响应对象(res)以及应用程序请求—响应周期中的 next 函数的函数,next 函数是 Express 路由器中的一个函数,当被调用时,它会在当前中间件之后执行中间件。
中间件函数可以执行以下任务:
执行任何代码。
更改请求和响应对象。
结束请求—响应周期。
调用堆栈中的下一个中间件。
如果当前的中间件函数没有结束请求—响应周期,它必须调用 next() 将控制权传递给下一个中间件函数,否则,请求将被挂起。
下图显示了中间件函数调用的元素:
示例
以下是一个简单的“Hello World”Express 应用程序示例,本文的其余部分将为应用程序定义和添加两个中间件函数:一个名为 myLogger,用于打印简单的日志消息,另一个名为 requestTime,用于显示 HTTP 请求的时间戳。
var express = require(‘express’)
var app = express()
app.get(‘/’, function (req, res) {
res.send(‘Hello World!’)
})
app.listen(3000)
中间件函数 myLogger
这是一个名为“myLogger”的中间件函数的简单示例,当对应用程序的请求通过时,此函数只打印“LOGGED”,中间件函数被分配给名为 myLogger 的变量。
var myLogger = function (req, res, next) {
console.log(‘LOGGED’)
next()
}
注意上面的调用 next(),调用此函数会调用应用程序中的下一个中间件函数,next() 函数不是 Node.js 或 Express API 的一部分,而是传递给中间件函数的第三个参数。next() 函数可以命名为任何,但按照惯例,它总是被命名为“next”,为避免混淆,请始终使用此约定。
要加载中间件函数,请调用 app.use(),指定中间件函数,例如,以下代码在到根路径(/)的路由之前加载 myLogger 中间件函数。
var express = require(‘express’)
var app = express()
var myLogger = function (req, res, next) {
console.log(‘LOGGED’)
next()
}
app.use(myLogger)
app.get(‘/’, function (req, res) {
res.send(‘Hello World!’)
})
app.listen(3000)
每次应用程序收到请求时,它都会向终端输出消息“LOGGED”。
中间件加载的顺序很重要:首先加载的中间件函数也会先执行。
如果 myLogger 在到达根路径的路由之后加载,则请求永远不会到达它,并且应用程序不会打印“LOGGED”,因为根路径的路由处理程序会终止请求—响应周期。
中间件函数 myLogger 只是打印一条消息,然后通过调用 next() 函数将请求传递给堆栈中的下一个中间件函数。
中间件函数 requestTime
接下来,我们将创建一个名为“requestTime”的中间件函数,并将一个名为 requestTime 的属性添加到请求对象中。
var requestTime = function (req, res, next) {
req.requestTime = Date.now()
next()
}
该应用程序现在使用 requestTime 中间件函数,此外,根路径路由的回调函数使用中间件函数添加到 req(请求对象)的属性。此外,根路径路由的回调函数使用中间件函数添加到 req(请求对象)的属性。
var express = require(‘express’)
var app = express()
var requestTime = function (req, res, next) {
req.requestTime = Date.now()
next()
}
app.use(requestTime)
app.get(‘/’, function (req, res) {
var responseText = ‘Hello World!<br>’
responseText += ‘<small>Requested at: ‘ + req.requestTime + ‘</small>’
res.send(responseText)
})
app.listen(3000)
当你向应用程序的根目录发出请求时,应用程序现在会在浏览器中显示你的请求的时间戳。
因为你可以访问请求对象、响应对象、堆栈中的下一个中间件函数以及整个 Node.js API,所以中间件函数的可能性是无穷无尽的。
有关 Express 中间件的更多信息,请参阅:使用 Express 中间件。
可配置的中间件
如果你需要中间件可配置,请导出一个接受选项对象或其他参数的函数,然后根据输入参数返回中间件实现。
文件:my-middleware.js
module.exports = function(options) {
return function(req, res, next) {
// Implement the middleware function based on the options object
next()
}
}
现在可以使用中间件,如下所示。
var mw = require(‘./my-middleware.js’)
app.use(mw({ option1: ‘1’, option2: ‘2’}))
有关可配置中间件的示例,请参阅 cookie-session 和 compression。
上一篇:路由