为 Express 应用开发中间件
概述
中间件 函数本质上是一些可以在应用的请求-响应周期内,访问 请求对象 (req
),响应对象 (res
),和 next
方法的函数。next
方法是 Express 路由中的一个方法,当被调用时,它将在当前中间件的基础上执行下一个中间件。
中间件函数可以执行下面这些任务:
- 执行一些逻辑代码。
- 改变请求和响应对象。
- 结束请求-响应周期。
- 在执行栈中调用下一个中间件。
如果当前的中间件函数没有结束掉请求-响应周期,它必须调用 next()
把控制权传递给下一个中间件函数。否则,请求将会被一直处于挂起状态。
下图展示了中间件函数调用的元素:
中间件函数对应的 HTTP 方法。
中间件函数对应的 (路由)路径。
中间件函数
中间件函数的回调参数,通常称为「next」
中间件的参数 HTTP 响应,通常称为 「res」。
中间件的参数 HTTP 请求 ,通常称为「req」。
\
例子
下面是一个简单的 Express 应用「Hello World」。接下来的文章中将会定义两个中间件函数:一个叫做 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
中间件函数了。当然,根路由的回调函数也可以使用 requestTime
中间件添加到 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) {
// 基于输入参数的中间件实例
next()
}
}
现在可以像下面这样使用这个中间件了。
var mw = require('./my-middleware.js')
app.use(mw({ option1: '1', option2: '2' }))
有关可配置中间件的示例,请查看cookie-session和compression 这两个中间件。
© 著作权归作者所有
发表评论