Express
Express 中文网
本文仅用于学习记录,不存在任何商业用途,如侵删
文章目录
- Express
- 7 指南 - 开发中间件
- 7.1 概述
- 7.2 例子
- 7.2.1 中间件函数 myLogger
- 7.2.2 中间件函数 requestTime
- 7.2.3 中间件函数 validateCookies
- 7.3 可配置的中间件
7 指南 - 开发中间件
编写用于 Express 应用程序的中间件
7.1 概述
中间件函数是可以访问请求对象 ( req
)、响应对象( res
) 和next
应用程序请求-响应周期中的函数的函数。
该next
函数是 Express 路由器中的一个函数,当被调用时,它会在当前中间件之后执行中间件。
中间件函数可以执行以下任务:
- 执行任何代码。
- 更改请求和响应对象。
- 结束请求-响应周期。
- 调用堆栈中的下一个中间件。
如果当前中间件函数没有结束请求-响应循环,它必须调用next()
以将控制权传递给下一个中间件函数。否则,请求将被挂起。
下图显示了中间件函数调用的元素:
从 Express 5 开始,返回 Promise 的中间件函数将next(value)
在它们拒绝或抛出错误时调用。【嗯,现在还是4】
next
将使用被拒绝的值或抛出的错误调用。
7.2 例子
一个简单的“Hello World”Express 应用程序示例。
运行测试下:
没问题。
接下来,将定义并向应用程序添加三个中间件函数:一个调用myLogger
打印简单的日志消息,一个调用requestTime
显示 HTTP 请求的时间戳,另一个调用validateCookies
验证传入的 cookie。
7.2.1 中间件函数 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
在路由到根路径 (/) 之前加载中间件函数。
重新运行,测试
从结果中可以看到,每次应用程序收到请求时,它都会将消息“LOGGED”打印到终端。
中间件加载的顺序很重要:首先加载的中间件函数也会先执行。
如果myLogger
在路由到根路径之后加载,则请求永远不会到达它并且应用程序不会打印“LOGGED”,因为根路径的路由处理程序终止了请求-响应循环。
中间件函数myLogger
只是打印一条消息,然后通过调用该函数将请求传递给堆栈中的下一个中间件next()
函数。
7.2.2 中间件函数 requestTime
接下来,我们将创建一个名为“requestTime”的中间件函数,并为请求对象添加一个名为requestTime` 的属性。
var requestTime = function (req, res, next) {
req.requestTime = Date.now()
next()
}
var express = require('express')
var app = express()
// var myLogger = function (req, res, next) {
// console.log('LOGGED')
// next()
// }
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)
重启服务,测试
当您向应用程序的根发出请求时,应用程序现在会在浏览器中显示您的请求的时间戳。
7.2.3 中间件函数 validateCookies
最后,我们将创建一个中间件函数来验证传入的 cookie 并在 cookie 无效时发送 400 响应。
这是一个使用外部异步服务验证 cookie 的示例函数。
async function cookieValidator (cookies) {
try {
await externallyValidateCookie(cookies.testCookie)
} catch {
throw new Error('Invalid cookies')
}
}
在这里,我们使用cookie-parser
中间件
从对象中解析传入的 cookiereq
并将它们传递给我们的cookieValidator
函数。中间件返回一个 Promise ,validateCookies
在拒绝时会自动触发我们的错误处理程序。
var express = require('express')
var cookieParser = require('cookie-parser')
var cookieValidator = require('./cookieValidator')
var app = express()
async function validateCookies (req, res, next) {
await cookieValidator(req.cookies)
next()
}
app.use(cookieParser())
app.use(validateCookies)
// error handler
app.use(function (err, req, res, next) {
res.status(400).send(err.message)
})
app.listen(3000)
运行服务, 测试
请注意如何
next()
调用 afterawait cookieValidator(req.cookies)
。这确保了如果cookieValidator
解决,堆栈中的下一个中间件将被调用。如果您向next()
函数传递任何内容(字符串'route'
或除外'router'
),Express 会将当前请求视为错误,并将跳过任何剩余的非错误处理路由和中间件函数。
因为您可以访问请求对象、响应对象、堆栈中的下一个中间件函数以及整个 Node.js API,所以中间件函数的可能性是无穷无尽的。
有关 Express 中间件的更多信息,请参阅:使用 Express 中间件。
7.3 可配置的中间件
如果您需要可配置中间件,请导出一个接受选项对象或其他参数的函数,然后根据输入参数返回中间件实现。
文件: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' }))
Refer to cookie-session and compression for examples of configurable middleware.
有关可配置中间件的示例,请参阅cookie-session和压缩。