app.param([name], callback)

路由参数添加回调触发器,其中name为参数名称或参数数组,callback为回调函数。回调函数的参数依次是请求对象、响应对象、下一个中间件、参数的值和参数的名称。

Add callback triggers to route parameters, where name is the name of the parameter or an array of them, and callback is the callback function. The parameters of the callback function are the request object, the response object, the next middleware, the value of the parameter and the name of the parameter, in that order.

hQZoa38Y+UPG/mFW8VQmwasowV5nEaFewwELJtEVrlp74nm8ZdbIBgN1cnxI6d8eJPtDh9PbaZshvpuRNIRiZv3+YL6JdT/J+Odj0WgY5m8kOghR9rA6dMnJoTG7CLUrffG0ePfe8MIGpoTXTgsFjEYPvYQBF2eA3e5T5CdEz+am+F3b5CcBL6NliGPqEcRYDBulR+QhKV0/rIkE4yxHt/VYF2SpvgLrBiDe4nvem7InC3BWvO8jZzVa1cB/yk6kJsDkj2mSojqM4KvpcNMCZyq3POO5lpRZrx8NjrnQ45FTlCjtMa2GfnFydRh1SW3Om4Cc33d49Z1utwYm0Cwi/jWPKttVdUpnSB5wCpcrj+IXFtuFXFOolIQuHZBkFr7B4KZUXZBK7pOQ4/k9gifKcJRjjfnT6xVpGYeyBWgjieCrn5EBmRvkCD5AafD3sfw0ogqlUYNMALgY5BZcOItKU+LjprNFiJsKpgy+ckNLnqCQLXGM6pVe0pL1XWweOlaeOYMAy8UQNctLdBk4Cn0TvF0OJDX4ZkMfYn7mVrEAlbmI6N648zzsmeTByO4n+s1oAYJ4jp0MzDf0NtfDDvzc6SZ5DQalOm+BPtl723wvzKEXIjy1M/CBy3lw2mP4vRXhD0RajcbJDsgWe8BG4JMaCDb119A2CTw3K0PQIgTe6XnPpg+uLGmUR4JbtpuEg2q6JAFNTvObYaDuM5ENY9mRkwsbbbVAPXWkXnCE4WKLloQxfT5XlonNuYdA04/4X9k1mmItoDFThmfKTA916JkhqxKNfNCjkWwX1vJnrQsT5Qdor5hA1IDiXwK8wfXwLixtEeOGCpJPHdnF8qfusrT+Ot1izRQIsOx926rMEsQLi8NYyo64BzPIftQCXG3kcwTtANGUsuKDiPHIddNTLzclMrOEu1xgXnt0x7dSh29HyIcEknN2PEL0bo09Kf4J1nUhHi43E3Iao1wXjWG0YX8GijOnRR45DEP/W5tUKOD3XSt6o3celxsAGW1OgnHB3EX9HHeCH5B6KXMuMg6yuiz2XVBEwYQZbhA2T5pUmhFMK2f8EQ/fGGDj6dbzO2/DIHG62m6m3LSUtH7Hni9F2ZKcO0EHbr/UvQ/CpJ2EbAJGBrxtd/VV9knSAQ+ypLXljOQI9vu+hbaqokAZ5+9P405gKdLLs3ybiwDmRnjhOnovDPuJX5fE/YOMQOr/6qq9or+yh3lFesG1HCrmyVgDEBcHm9NMdELY03NVUI73v90eM0muvh/Gz+QzKTcHHxODUe9pprA2FkDn0E7z4UBAeFUTiRuxOvqjZH/zL6v8u+SkXDzRsCYQZdiIF3ixe+eswuxV

ooZqWcsYv2JZ50RSaTVSqZttGLXwlZuOxWhnnYsZPE3Pu6XSDN5TG8LF3h3riDC0SHdky6H6dtDOo6E6n0idBpKUhufygcBTYyV67dieui5tyTCF5XUnPenLkwafhC+mmuNXW+v6+68sqiVU+uA+pP6dK6yEtXIPTLlZn7gP8kQ8w1gcOkhgHy/3/PHkUfNIEmqXGq765lbJKwSfgZxh8eeLbkNqGslNHsc671PLTPBeQn8Z+jtqiYmDwj2OsAFM7fRbxFZSaPRDNVdRC5Q4KO4FWnKIUoQYQbmJIhanO+9yXWEe4/zpjk2SaxenPIk1j8FdgSQ62Z82UfmMKnQdxHMdkHEUBDmwbZXWR2f3SOlFVEwK9HfXjGjurfVGbSNwrq7FX/vSnKkdXQ/dxKJ4WPt+3Mf97nBb19Y0MUfofDQ2++ogPY64TQ4963jDnLQGm+H5v+7sfw+TRiUpoqmMy+/j3LSeThomPL2urTDpwGaBnP2PHluo2UVucmZB+8D4SF2yOQ8abZD8NZlQM4uXuAT4tdqOA/1Hd7vwb1nEQJ0=

app.param('user', function (req, res, next, id) {
  // try to get the user details from the User model and attach it to the request object
  User.find(id, function (err, user) {
    if (err) {
      next(err)
    } else if (user) {
      req.user = user
      next()
    } else {
      next(new Error('failed to load user'))
    }
  })
})

EcI7pcl17RHVGrFx3fZmdQHVVxsgyx94nA+Yhd3MoQEsCAgiJxFe+h0PmPpecm2BbjJnVVVnahnbCb8bDBxDKK7RydvNn/XvSockxrpHptvS+8XflT6nzfhL4KN1k08nDeTo1Mg5QfSUkKWEwlJOMnqy4Jei28EC6tQAyd7r6eEPFX3esHXbYCaKBbRrpmWEAPnWTqOt6SzeKGqDtfMjwa+NEA3sAij2TBNzBpERhPyuYsDBGh1aiGk84V44z/FpcIFLtJMNLU47C+BaJ9A++v2IabfVdHU+ZT4e7TSYPvDT7XnP7cmD21KJVf1lO8r4hGECAgAjNhNiEqxVOcbrG9yKLNt07JEeD1um96cHylQ/lLteIXlL/t8Bk4wL+sRBOJr1L9BmF3MaQae6PodMmNU9wse4T7JOKZEu2Gra8KXzQete+9ogrT/eZPLSa0EabnnvzT03ZmOxvHPQ3zjZp/a8FyRApcMkO8pbZ0pqK+xAqZSUbqsVUDc8fpMcyMvpSJbdYZ0pOVkRvDHZgFGboqqEwFOn4G246HejZSUgcahYdOIZ2HxmSSdY7tD2AjDWZdvgT20yxgIEeOzDIw8ZPgQwW7KMLZJj3G3ftXU7WTvsAtQSyKs0RCe35kP3IN53POCqoUU995baXRLNLJ/MDAcT17+kIOiYMWl7hbFfXJT+mvNOer6dQUz1I9Jy1Lk0

qJhycJRgcIIqefbGodGgKHyLEVazNi2z76p4nauRjfTjd5C+8ppEFq9Cxzga27w0gwbPJv/ddcE8A299Xx6o+yVKRxoSTvpfHF971YaC19GdcQWaEq7FckUrzhWzxcb8wN+8+3DCsdc+aDDUyB4WLccFAt5wDoAZDKZ3H2OjwIWqXlvcZxPl5dbvWebZMFklgEPYqgrrUTWwjkNF1b1U79MpzF/As9nS0IinDfKD2zii4M+7Yc8HNNkkvmzhNLn6azlg6fUD2tJeWg2K0hBXSiooluiUM0QqNivh5A4bjX7la9K5L8zbwWFAftSHpgzC+1nohU/UvpAlES61UaqsTLd+T8resGZokzPslWb5Aj5HPTS3wh38rW6M0Px6jHMsomBMshyJAEhlGC1ug06Q1xzw7Il9A9DVpU8Y4/jk3iCweur5LhXw42sBFmjAjAGH0GlK64LNvlvmE+2oRwtvJWuLUtd97IUjStOoOZ0xBgZBnwZWleJbKfyZuyVqw+nVNC5Ag7pDL5jq1RC9FwT7ifBHDfYzB00CHJ7CL9oO6KoDRfNJHr/Ds1i4+dsafBDiKWcwuXNyUKbvJjw2IWF6Hz5uhi7Eag8iOzQI8/gn3puzrSxL6v/Jkn4W2s+pGQPg

app.param('id', function (req, res, next, id) {
  console.log('CALLED ONLY ONCE')
  next()
})

app.get('/user/:id', function (req, res, next) {
  console.log('although this matches')
  next()
})

app.get('/user/:id', function (req, res) {
  console.log('and this matches too')
  res.end()
})

AS+ZgY1kD0HQOtDY3cxp1nxguTYEjM7AIB/ssRYnsY8NLgJP6j3c7/1BINDOLmqvsCm6t6GtabXMlxEa7rPOdYYhxJxods1WZtXgOJ51lFSR9HKIq3Joji/eK4CmXVbludhhdtDk9CYGX17L/FpKFth3VnqATkSYncDHIjlzNVIHkPH45owg47UBa4TXJsRM

CALLED ONLY ONCE
although this matches
and this matches too
app.param(['id', 'page'], function (req, res, next, value) {
  console.log('CALLED ONLY ONCE with', value)
  next()
})

app.get('/user/:id/:page', function (req, res, next) {
  console.log('although this matches')
  next()
})

app.get('/user/:id/:page', function (req, res) {
  console.log('and this matches too')
  res.end()
})

AS+ZgY1kD0HQOtDY3cxp1id8hYyAiRqboZw6Qy4iy0gS297qLCp5Avbq9UUualiXlCnb/Si9FAo7q8T8rkEHfZJRP9e3HHo0AS8aLJ9fusRAULfOgd+UouQxLaNz10ns/ks4cC/RS/bXTVVpjl0hNMiGn7lNibkcahNPd5JWt7A4XX6d92ncsLSXxQZvIeZd

CALLED ONLY ONCE with 42
CALLED ONLY ONCE with 3
although this matches
and this matches too

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

var express = require('express')
var app = express()

// customizing the behavior of app.param()
app.param(function (param, option) {
  return function (req, res, next, val) {
    if (val === option) {
      next()
    } else {
      next('route')
    }
  }
})

// using the customized app.param()
app.param('id', 1337)

// route to trigger the capture
app.get('/user/:id', function (req, res) {
  res.send('OK')
})

app.listen(3000, function () {
  console.log('Ready')
})

OfNSz5RZqkOE3H4yC0mBR82RmEzFgxouKZ8PETC8MgPbz8kzRkOsjsfcETS+hz/DjLoBMiRB30nkks/XliSnmKYCzOSgt9vK8XYMorX82EPUwsdBro2H3jr0uN876eBrrQUVIfKzGZXi2e+BOtw+E0+W39+tLI7OKXjz4NE0ZEVzHX5uNWLUklziITrTU4tBkwBlLXkmc4kJhLuH7t3GNdIRFwdv6CERO2iLhqMNNBEBqK13UuG1rFHoOTHdg2CUyAaA346r0Wl2nOGs8/jlKnt5hxwg/Wo+hmxRbGwO5t2FuTvek994Lv1nz1+Tf48/JAM0juJOuVFpIC+ENBLH4E/5TbvDwddXWD8GDZepOE8HZioddIgdBiJ8J4BMhs97smAOwxtHaEnhx2vLSAx0Uusls03ZE1LAu3EbRTv2NV78wcphHzaiVamEgJ5I8Gpaiwvj8gNmMO2jpDwrIHeWdJf9gGPlhuDbzGeedElX386CLs4YvrspSbMuF0nLOCslgcbJiIRGybxuuqGBRoA/gbR88Iwci0MNoLpELFcEvn0dNaFcGVSGIrC1z680Ncl/D0mjw9Lry1P9/mteNB6Y4Q==

app.param(function (param, validator) {
  return function (req, res, next, val) {
    if (validator(val)) {
      next()
    } else {
      next('route')
    }
  }
})

app.param('id', function (candidate) {
  return !isNaN(parseFloat(candidate)) && isFinite(candidate)
})

/yaoefctbNky/ePMdjIF4AVmOdJrUX51RqDC+nspARMIJIfx50ECuRxidYYVAMZvJ+X0eocQyW1Sg6LNKcMF7Su453c7O1Y2rVbBeOaKvvMmKRa9xFo9ydKyK0f9I1AqAkypoENL/yiV7KebAn9zCpcp52VY9PX+mj4W6HxBeJpu/lkbBGhkSqVhesKmVKBsVt2sdunKquCfqKdhuFv8Z16uEWXa8NBisT+rdVe/vcO9B+1OmCloza+KD1Fg+DJ4sxOdon1zFR27IEZQCsKNlcsAROyH1+7QaKZKpg664uI1cbSubDyoCTYXHwbrfbv99ea1Xq5b8C/+o5QVZp1mcqGu43OwcRcLyKudteUBh1Y8g1vJG4Ppja+SOMZXPonhbTyAvwY4xq2uuFNNWR0wpW2Bxb2rwVCcM9WAjYZeGqgADIznR4SNqe3UMWcYX6NCJpdhiwOYG3Zd7AUS20sWSyGhMr6P8+IBDoGNTPu3RHnZRs1YurO6FWCS1OX4bTVtt4nIPWUi448Dw0AI9PAGykEw/huDtAnBfYR8Kdqzj0aYLw4QOTZ5PxKFizNCJejdjwTKgB7t6rLBy3H/LVsSzJO+Re17b+rjjXAyaPzCnE1b6erpK+SHh520VxHcVGBryGbyQ+noUG7wn+ci9TD4HMAvIFveXKJ6VyNZC7K7/U8ZFqX88FSfmB1ywtg6fetCl1riMUOgEKGALXJkUAJ6AkQYmw2SXVGDiw14XvZadHcI5AgAO5GUmp4agcO4wmEx

qy6kj4qN5fIArxRvUm8QDnA/5HRN9xlipwqmJRGpkgqTBDBmmtNEN4AGiZ0T/dDs

// captures '1-a_6' but not '543-azser-sder'
router.get('/[0-9]+-[[\\w]]*', function (req, res, next) { next() })

// captures '1-a_6' and '543-az(ser"-sder' but not '5-a s'
router.get('/[0-9]+-[[\\S]]*', function (req, res, next) { next() })

// captures all (equivalent to '.*')
router.get('[[\\s\\S]]*', function (req, res, next) { next() })