# app.param
给路由参数添加回调触发器。
# 概要
app.param(name, callback)
# 描述
给路由参数添加回调触发器,其中name
为参数名称或参数数组,callback
为回调函数。回调函数的参数依次是请求对象、响应对象、下一个中间件、参数的值和参数的名称。
如果 name
是一个数组,则为其中声明的每个参数注册 callback
触发器,按照它们的声明顺序。此外,对于除最后一个之外的每个声明的参数,在回调中调用 next
将为下一个声明的参数调用回调。对于最后一个参数,对 next
的调用将调用当前正在处理的路由的下一个中间件,就像 name
只是一个字符串一样。
例如,当 :user
出现在路由路径中时,您可以映射用户加载逻辑以自动将 req.user
提供给路由,或对参数输入执行验证。
app.param('user', (req, res, next, id) => {
// try to get the user details from the User model and attach it to the request object
User.find(id, (err, user) => {
if (err) {
next(err)
} else if (user) {
req.user = user
next()
} else {
next(new Error('failed to load user'))
}
})
})
参数回调函数在定义它们的路由上是本地的。它们不会被安装的应用程序或路由继承。因此,在 app
上定义的参数回调将仅由在 app
路由上定义的路由参数触发。
所有参数回调将在参数出现的任何路由的任何处理程序之前调用,并且它们在请求-响应周期中仅被调用一次,即使参数在多个路由中匹配,如下例所示。
app.param('id', (req, res, next, id) => {
console.log('CALLED ONLY ONCE')
next()
})
app.get('/user/:id', (req, res, next) => {
console.log('although this matches')
next()
})
app.get('/user/:id', (req, res) => {
console.log('and this matches too')
res.end()
})
在 GET /user/42
上,打印以下内容:
CALLED ONLY ONCE
although this matches
and this matches too
``app.param(['id', 'page'], (req, res, next, value) => {
console.log('CALLED ONLY ONCE with', value)
next()
})
app.get('/user/:id/:page', (req, res, next) => {
console.log('although this matches')
next()
})
app.get('/user/:id/:page', (req, res) => {
console.log('and this matches too')
res.end()
})
在 GET /user/42/3
上,打印以下内容:
CALLED ONLY ONCE with 42
CALLED ONLY ONCE with 3
although this matches
and this matches too
← app.METHOD app.path →