2017-05-05 9 views
2

Iまし以下のミドルウェア:router.useミドルウェアチェーンが期待通りに機能していませんか?

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

SCENARIO 1

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

SCENARIO 2

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

シナリオ1を実行している間、私はspecialValueは、コンソールにログインして取得します。 SCENARIO 2を実行しているときに、コンソールにundefinedが記録されています。

私はシナリオ2にログspecialValueも記録すると予想していました。

本当にありがとうございます。 ありがとうございます。

EDIT:私は、ルータがparamsを作成するものであるとして6.10.3

+0

私は通常、 'use'は依然として尊重されたオーダーと思っていましたが、順序依存のものには' router.use(....) 'の代わりに' router.all(...) 'を使用します。 – Funkodebat

+0

' req .params'は 'router.use()'を使って追加された各ミドルウェアが呼び出される前にリセットされます。 'app.all()'でも同じことは起こりません。これが文書化された動作であるかどうかはわかりませんが、確かに私が知らなかったものです。 – robertklep

答えて

0

シナリオ2は、特急の「設計によって」エラーを引き起こしているエクスプレス4.14.0およびノー​​ドを使用しています。それは

を上書きなっているあなたはreq.specialParam = 'specialValue'

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

}); 

その他のオプションはのparamsを変更するためにあるような要求 に渡すことapp.use内の別のプロパティにVARを割り当てることができます.param()方法ウィット:

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

または

app.route('/user/:name') 
.all((req, res) => { ... console log here }) 
.get((req, res) => { ... }) 
+0

私はparamsがexpressで上書きされているのを知っていますが、各層でです。私が理解していないのは、なぜ 'router.use'を使用した場合にのみ各ミドルウェア間でparamsオブジェクトが変更されるかです – MerLito

関連する問題