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() })