运用中间件
Express是一个路由和中间件Web框架,其自身的功用异常小:Express应用顺序本质上是一系列中间件函数挪用。
中间件函数是能够接见要求对象(req
)、相应对象(res
)以及应用顺序要求—相应周期中的下一个中间件函数的函数,下一个中间件函数一般由名为next
的变量示意。
中间件函数能够实行以下使命:
- 实行任何代码。
- 变动要乞降相应对象。
- 完毕要求—相应周期。
- 挪用客栈中的下一个中间件函数。
假如当前的中间件函数没有完毕要求—相应周期,它必需挪用next()
将控制权传递给下一个中间件函数,不然,要求将被挂起。
Express应用顺序能够运用以下范例的中间件:
- 应用顺序级中间件
- 路由器级中间件
- 毛病处置惩罚中间件
- 内置中间件
- 第三方中间件
你能够运用可选的装载途径加载应用顺序级和路由器级中间件,你还能够将一系列中间件函数加载在一起,从而在装载点建立中间件体系的子客栈。
应用顺序级中间件
运用app.use()
和app.METHOD()
函数将应用顺序级中间件绑定到app
对象的实例,个中METHOD
是中间件函数处置惩罚的要求的小写HTTP要领(比方GET,PUT或POST)。
此示例显现了没有装载途径的中间件函数,每次应用顺序收到要求时都邑实行该函数。
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')
})
// handler for the /user/:id path, which prints the 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) {
// if the user ID is 0, skip to the next route
if (req.params.id === '0') next('route')
// otherwise pass the control to the next middleware function in this stack
else next()
}, function (req, res, next) {
// send a regular response
res.send('regular')
})
// handler for the /user/:id path, which sends a special response
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()
// 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()
})
// a middleware sub-stack shows request info for any type of HTTP request to the /user/:id path
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()
})
// a middleware sub-stack that handles GET requests to the /user/:id path
router.get('/user/:id', function (req, res, next) {
// if the user ID is 0, skip to the next router
if (req.params.id === '0') next('route')
// otherwise pass control to the next middleware function in this stack
else next()
}, function (req, res, next) {
// render a regular page
res.render('regular')
})
// handler for the /user/:id path, which renders a special page
router.get('/user/:id', function (req, res, next) {
console.log(req.params.id)
res.render('special')
})
// mount the router on the app
app.use('/', router)
要跳过其他路由器中间件函数,请挪用next('router')
将控制权交还出路由器实例。
此示例显现了一个中间件子客栈,它处置惩罚对/admin
途径的GET要求。
var app = express()
var router = express.Router()
// predicate the router with a check and bail out when needed
router.use(function (req, res, next) {
if (!req.headers['x-auth']) return next('router')
next()
})
router.get('/', function (req, res) {
res.send('hello, user!')
})
// use the router and 401 anything falling through
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')
// load the cookie-parsing middleware
app.use(cookieParser())
有关Express经常使用的第三方中间件函数的部份列表,请参阅:第三方中间件。