2016-05-16 11 views
1

を使用します...は、私がこのように、いくつかのファイル内のコントローラとアプリを持っている特急ミドルウェア、すべての機能が、1つのコントローラ

var aRoutes = require('./controllers/controllerA'); 
var bRoutes = require('./controllers/controllerB'); 
var cRoutes = require('./controllers/controllerC'); 

app.use('/a', aRoutes); 
app.use('/b', bRoutes); 
app.use('/c', cRoutes); 
// ... several more 

そして、私はこのようなミドルウェア機能を持っている

app.use(function (req, res, next) { 
    // do a middleware thing 
    // but not if route == x or y or z or ... yuck! 
}); 

そして、私はそのミドルウェアがすべてを実行するようにしたいが、 aRoutesを除く。私は答えを見つけましたlike this、ミドルウェアのチェックを追加することを示唆fnのすべてのルートが除外されるが、それはひどいです、と私は思います。チェックするルートがたくさんある可能性があり、それらの例外ルートの1つを追加すると2つの場所でコードに触れる必要があります。

もっと良い方法が必要でしょうか?

+0

別々のルータを使用して、ミドルウェアコールを必要なルータに入れ、使用しないルータには入れないでください。各ルータに独自のパスがある限り、それは設定されます。 – jfriend00

答えて

1

あなたが正しく理解しているとすれば、ミドルウェアとルートの順序を並べ替えることで解決できます。今

var aRoutes = require('./controllers/controllerA'); 
var bRoutes = require('./controllers/controllerB'); 
var cRoutes = require('./controllers/controllerC'); 

app.use('/a', aRoutes); 

app.use('/',function (req, res, next) { 
    // do a middleware thing 
    next(); 
}); 

app.use('/b', bRoutes); 
app.use('/c', cRoutes); 
// ... several more 

あなたがres.renderまたはnext()と要求応答サイクルを終了していない他のいくつかのアクションであなたのaRoutesを終了した場合、ミドルウェアはaRoutes上で実行することはありません。

ただし、他のすべてのルートで実行されます。これはもちろん、ミドルウェアが要求 - 応答サイクルを開始するようにしたい場合にのみ有効です。別の場所に置いておきたい場合は、それに応じてコードを並べ替える必要があります。

関連する問題