2016-08-28 5 views
2

私はアプリケーションでルートを構築するためにエクスプレスルータを使用していますが、ミドルウェアはその特定のルータにヒットすると呼び出されるようにカスタムミドルウェアを各ルートに適用しようとしています。ここに私のコードは次のとおりです。Expressミドルウェアが呼び出されていない

const express = require('express'); 
const router = express.Router(); 
const authentication = require('./helpers/authentication'); 

const registerController = (app, path, router, middleware) => { 
    middleware.forEach((routerMiddleware) => { 
    router.use(routerMiddleware); 
    }); 
    app.use(path, router); 
}; 

const testMiddleware = (request, response, next) => { 
    console.log(request.originalUrl); 
    next(); 
}; 

module.exports = { 
    init: (app) => { 
    registerController(app, '/auth', require('./authenticationController'), [testMiddleware]); 
    registerController(app, '/customer', require('./customerController'), [authentication, testMiddleware]); 
    registerController(app, '/filter', require('./filterController'), [authentication, testMiddleware]); 
    registerController(app, '/', require('./homeController'), [testMiddleware]); 
    registerController(app, '/inventory', require('./inventoryController'), [authentication, testMiddleware]); 
    registerController(app, '/settings', require('./settingsController'), [authentication, testMiddleware]); 
    } 
}; 

私は別のルータに異なる構成でミドルウェアを割り当てることができますので、私はregisterController方法を構築しました。各ファイル名のxxxControllerに引っ張る文は、このようなルータ戻っている必要:

const router = require('express').Router(); 
const fs = require('fs'); 

router.get('/', (request, response) => { 
    const file = fs.readFileSync(__dirname + '/../index.html', "utf8"); 
    response.send(file); 
}); 

module.exports = router; 

を私は最も簡単なミドルウェアがうまくいくかどうかを確認するためのテストミドルウェアを追加しましたが、それが呼び出されていません。私はここで間違って何をしていますか?

+0

実際には、異なるコールで同じルータインスタンスが使用されていません。おそらく、ファイルの先頭にルータを表現するための参照があるからだと思います。これは今は未使用の変数なので、これは私の間違いでした。 registerControllerの各呼び出しは3番目のパラメータとしてルータを受け取り、各呼び出しでrequire文の戻り値を渡します。これらのすべてのステートメントは、エクスプレスルータの別のインスタンスを返します。 – jdavis

答えて

1

routerMiddlewareが表示されない理由は、既にリクエストに応答しているコントローラファイルにrouter.get()があるためです。今度はあなたのコントローラファイルにrouter.post()がないので、、次に、あなたのrouterMiddlewareが呼び出されます。

Expressは、ルータ/アプリケーションに追加された順にルートを評価します。

1

Expressルーターを構築する場合は、ルートを設定してミドルウェアを追加する順序が非常に重要です。たとえば、ルートを追加してからミドルウェアを追加すると、ルートが追加され、ミドルウェアが追加された後に追加されたルートだけがミドルウェアが呼び出されます。ミドルウェアがセットアップされる前に設定されていた最初のルートは、ミドルウェアが呼び出されるのをトリガーしません。

私のコードでは、ルータに追加されたすべてのミドルウェアがすべてのルートで呼び出されると仮定して、すべてのルートを構築してミドルウェアを追加していたという問題がありました。

解決策はリファクタリングして、各ルータの始めにミドルウェアを追加することでした。

関連する問題