使用中间件
Express 是一个路由和中间件 Web 框架,它本身具有最少的功能:Express 应用程序本质上是一系列中间件函数调用
应用级中间件
使用函数将应用程序级中间件绑定到app 对象的实例
此示例显示了一个没有挂载路径的中间件函数。每次应用收到请求时都会执行该函数。
var express = require('express')
var app = express()
app.use(function (req, res, next) {
console.log('Time:', Date.now())
next()
})
此示例显示了安装在路径上的中间件函数 /user/:id
app.use('/user/:id', function (req, res, next) {
console.log('Request Type:', req.method)
next()
})
此示例显示了路由及其处理程序函数(中间件系统)。该函数处理对路径的 GET 请求 /user/:id
。
app.get('/user/:id', function (req, res, next) {
res.send('USER')
})
下面的示例为该路径的 GET 请求定义了两个路由 /user/:id
。第二个路由不会引起任何问题,但它永远不会被调用,因为第一个路由结束请求。
app.get('/user/:id', function (req, res, next) {
console.log('ID:', req.params.id)
next()
}, function (req, res, next) {
res.send('User Info')
})
app.get('/user/:id', function (req, res, next) {
res.send(req.params.id)
})
要跳过第一个路由器中间件的其余中间件功能,请调用 next('route')
将控制权传递给下一个路由。 注意:仅在使用或功能 next('route') 加载的中间件功能中起作用
app.get('/user/:id', function (req, res, next) {
if (req.params.id === '0') next('route')
else next()
}, function (req, res, next) {
res.send('regular')
})
app.get('/user/:id', function (req, res, next) {
res.send('special')
})
中间件还可以在数组中声明,以实现可重用性。
function logOriginalUrl (req, res, next) {
console.log('Request URL:', req.originalUrl)
next()
}
function logMethod (req, res, next) {
console.log('Request Type:', req.method)
next()
}
var logStuff = [logOriginalUrl, logMethod]
app.get('/user/:id', logStuff, function (req, res, next) {
res.send('User Info')
})
路由器级中间件
路由器级中间件的工作方式与应用程序级中间件相同,只是它绑定到的实例 express.Router()
。
var router = express.Router()
使用 router.use()
和 router.METHOD()
函数加载路由器级中间件。
var express = require('express')
var app = express()
var router = express.Router()
// a middleware function with no mount path. This code is executed for every request to the router
router.use(function (req, res, next) {
console.log('Time:', Date.now())
next()
})
router.get('/', function (req, res, next) {
next('router')
}, function (req, res) {
res.send('Hello World!')
})
错误处理中间件
错误处理中间件始终需要四个参数
。您必须提供四个参数来将其标识为错误处理中间件函数。即使您不需要使用该next对象,也必须指定它以维护签名。否则,该next对象将被解释为常规中间件,并且无法处理错误。
app.use(function (err, req, res, next) {
console.error(err.stack)
res.status(500).send('Something broke!')
})
内置中间件
从 4.x 版本开始,Express 不再依赖于 Connect(是一个用于构建 Web 应用的中间件框架)。 以前 Express 中包含的中间件功能现在位于单独的模块中;请参阅中间件功能列表。
第三方中间件
下面的示例说明如何安装和加载 cookie 解析中间件功能 cookie-parser
。
$ npm install cookie-parser
var express = require('express')
var app = express()
var cookieParser = require('cookie-parser')
app.use(cookieParser())
有关 Express 常用的第三方中间件功能的部分列表,请参阅:第三方中间件。