Node.js + Express 中的5种中间件
使用中间件
Express
是一种路由和中间件Web
框架,它具有自己的最小功能:Express
应用程序本质上是一系列中间件函数调用。
中间件函数是可以访问请求对象 (req)
,响应对象(res)
以及应用程序的请求 - 响应周期中的下一个中间件函数的函数。下一个中间件函数通常由名为的变量表示next
。
中间件功能可以执行以下任务:
- 执行任何代码。
- 更改请求和响应对象。
- 结束请求 - 响应周期。
- 调用堆栈中的下一个中间件函数。
如果当前的中间件函数没有结束请求 - 响应周期,则必须调用next()
以将控制传递给下一个中间件函数。否则,请求将被挂起。
Express
应用程序可以使用以下类型的中间件:
- 应用程序级中间件
- 路由器级中间件
- 错误处理中间件
- 内置中间件
- 第三方中间件
您可以使用可选的装载路径加载应用程序级
和路由器级中间件
。您还可以将一系列中间件功能加载在一起,从而在安装点创建中间件系统的子堆栈。
应用程序级中间件
通过使用和函数将应用程序级中间件绑定到
app
对象的实例,其中是中间件函数以小写形式处理的请求的HTTP
方法(例如GET
,PUT
或POST
)。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
路径的GET
请求。
app.get('/user/:id', function (req, res, next) {
res.send('USER')
})
复制代码
下面是一个使用挂载路径在挂载点加载一系列中间件函数的示例。它说明了一个中间件子堆栈,它将任何类型的HTTP
请求的请求信息打印到/user/:id
路径。
app.use('/user/:id', function (req, res, next) {
console.log('Request URL:', req.originalUrl)
next()
}, function (req, res, next) {
console.log('Request Type:', req.method)
next()
})
复制代码
路径处理程序使您可以为路径定义多个路径。下面的示例为/user/:id
路径的GET
请求定义了两个路由。第二个路由不会引起任何问题,但它永远不会被调用,因为第一个路由结束了请求 - 响应周期。
此示例显示了一个中间件子堆栈,用于处理对/user/:id
路径的GET
请求。
app.get('/user/:id', function (req, res, next) {
console.log('ID:', req.params.id)
next()
}, function (req, res, next) {
res.send('User Info')
})
// user/:id路径的处理程序,用于打印用户标识
app.get('/user/:id', function (req, res, next) {
res.end(req.params.id)
})
复制代码
要从路由器中间件堆栈中跳过其余的中间件功能,请调用next('route')
将控制权传递给下一个路由。 注意:next('route')
仅适用于使用app.METHOD()
或router.METHOD()
函数加载的中间件函数。
此示例显示了一个中间件子堆栈,用于处理对/user/:id
路径的GET
请求。
app.get('/user/:id', function (req, res, next) {
// 如果用户ID为0,则跳到下一个路由
if (req.params.id === '0') next('route')
// 否则将控件传递给此堆栈中的下一个中间件函数
else next()
}, function (req, res, next) {
// 返回数据信息
res.send('regular')
})
// user/:id路径的处理程序,它发送一个特殊的响应
app.get('/user/:id', function (req, res, next) {
res.send('special')
})
复制代码
路由器级中间件
路由器级中间件的工作方式与应用程序级中间件的工作方式相同,但它绑定到的是一个实例
express.Router()
。
var router = express.Router()
使用router.use()
和router.METHOD()
函数加载路由器级中间件。
以下示例代码通过使用路由器级中间件复制上面显示的应用程序级中间件的中间件系统:
var app = express()
var router = express.Router()
// 没有挂载路径的中间件功能。 对于路由器的每个请求都执行此代码
router.use(function (req, res, next) {
console.log('Time:', Date.now())
next()
})
// 对/ user/:id路径的任何类型的HTTP请求的都会执行
router.use('/user/:id', function (req, res, next) {
console.log('Request URL:', req.originalUrl)
next()
}, function (req, res, next) {
console.log('Request Type:', req.method)
next()
})
// 用于处理对/ user /:id路径的GET请求
router.get('/user/:id', function (req, res, next) {
// 如果用户ID为0,则跳到下一个路由器
if (req.params.id === '0') next('route')
// 否则将执行下一个中间件函数
else next()
}, function (req, res, next) {
// 渲染regular页面
res.render('regular')
})
// / user /:id路径的处理程序,它会渲染页面
router.get('/user/:id', function (req, res, next) {
console.log(req.params.id)
res.render('special')
})
// 初始化引入router中间件
app.use('/', router)
复制代码
要跳过路由器中间件的其余功能,请调用next('router')
将控制权交还给路由器实例。
此示例显示了一个中间件子堆栈,用于处理对/user/:id
路径的GET请求。
var app = express()
var router = express.Router()
// 在需要时对路由器的检查
router.use(function (req, res, next) {
if (!req.headers['x-auth']) return next('router')
next()
})
router.get('/', function (req, res) {
res.send('hello, user!')
})
// 使用路由器和设置请求结果状态码
app.use('/admin', router, function (req, res) {
res.sendStatus(401)
})
复制代码
错误处理中间件
错误处理中间件总是需要
四个参数
。您必须提供四个参数以将其标识为错误处理中间件函数。即使您不需要使用该next
对象,也必须指定它以保持签名。否则,该next
对象将被解释为常规中间件,并且将无法处理错误。
以与其他中间件函数相同的方式定义错误处理中间件函数,除了四个参数而不是三个,特别是签名(err, req, res, next))
:
app.use(function (err, req, res, next) {
console.error(err.stack)
res.status(500).send('Something broke!')
})
复制代码
有关错误处理中间件的详细信息,请参阅:错误处理。
内置中间件
从版本4.x开始,
Express
不再依赖于Connect
。之前包含在Express
中的中间件功能现在位于单独的模块中; 查看中间件功能列表。
Express
具有以下内置中间件功能:
-
express.static
提供静态资源,如HTML
文件,图像等。 -
express.json
使用JSON
有效负载解析传入的请求。注意:适用于Express 4.16.0+
-
express.urlencoded
用URL
编码的有效负载解析传入的请求。 注意:适用于Express 4.16.0+
第三方中间件
使用第三方中间件为
Express
应用程序添加功能。
安装Node.js
模块以获得所需的功能,然后在应用程序级别或路由器级别将其加载到您的应用程序中。
以下示例说明了安装和加载cookie
解析中间件功能cookie-parser
。
$ npm install cookie-parser
var express = require('express')
var app = express()
var cookieParser = require('cookie-parser')
// 加载cookie解析中间件
app.use(cookieParser())
复制代码
结尾
参考资料:点击更多