router.use中间件链没有按预期工作?

时间:2017-05-05 14:43:05

标签: node.js express

我有以下中间件:

injectParamMiddleware.js

module.exports = function(req, res, next) {
  req.params.specialParam = 'specialValue';
  next();
}

logParamMiddleware.js

module.exports = function(req, res, next) {
  console.log(req.params.specialParam);
  next();
}

情景1

router.get('/resource/:resourceId', 
           injectParamMiddleware,
           logParamMiddleware,
           ...MoreMiddlewares)

情景2

router.use('/resource/:resourceId', injectParamMiddleware, logParamMiddleware);
router.get('/resource/:resourceId', ...MoreMiddlewares);

在运行SCENARIO 1时,我在控制台中登录specialValue。 在运行SCENARIO 2时,我在控制台中登录undefined

我期待SCENARIO 2也能记录specialValue

非常感谢任何帮助。 提前谢谢。

编辑:我使用的是Express 4.14.0和Node 6.10.3

1 个答案:

答案 0 :(得分:0)

由于路由器创建了const assert = require('assert'); const emptySet = new Set() assert.strictEqual(![...emptySet].length, true) assert.strictEqual(emptySet.values().next().value === undefined, true) assert.strictEqual(emptySet.entries().next().value === undefined, true) const twoItemsSet = new Set([ 'foo', 'bar' ]) assert.strictEqual(![...twoItemsSet].length, false) assert.strictEqual(twoItemsSet.values().next().value === undefined, false) assert.strictEqual(twoItemsSet.entries().next().value === undefined, false) ,因此情景2导致了“设计”表示错误。它被覆盖了

您可以将var分配给将传递给请求的params中的另一个属性 例如app.use

req.specialParam = 'specialValue'

其他选项是使用app.param('/user/:name', (req, res) => { req.specialParam = 'specialValue'; }); 方法修改参数:

.param()

app.param('/user/:name', (req, res) => {});