# 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
Last Updated: 6/17/2023, 6:57:19 PM