2017-02-08 24 views
2

私は2つのルートを持っています。グローバル変数routeの中の最初のルート。開始ミドルウェアでは、2番目のルートもそのグローバル変数に戻ります。ミドルウェアの実行順序は?

var route = require('./routes/first'); 

app.use(function(req, res, next) { 
    route = require('./routes/second'); 
    next(); 
}); 

次に実行されると、まだ最初のルートがあります。 なぜ私の最初の中道は前に始まらなかったのですか?

// route contain module from './routes/first' 
app.use('/api', route); 

しかし、私は、コールバックの異なるデザインを使用している場合、第2の経路を取得することが可能である...

// route contain module from './routes/second' 
app.use('/api', function (req, res, next) { 
    return route(req, res, next); 
}); 

./routes/first.js

var express = require('express'); 
var route = express.Router(); 

route.get('/', function(req, res) { 
    res.send('First route'); 
}); 

module.exports = route; 

./routes/second.js

var express = require('express'); 
var route = express.Router(); 

route.get('/', function(req, res) { 
    res.send('Second route'); 
}); 

module.exports = route; 
+0

この行の前にコンソールログを置くことはできますか? 'route = require( './ routes/second');'? – kawadhiya21

+0

私はExpressアプリケーションでミドルウェアの順序の重要性に関する記事を書いています。ここに記事へのリンクがあります:https://www.nodexplained.com/blog-detail/2018/01/11/importance-of-middleware-order-in-expressjs-application –

答えて

1

それはapp.use('/api', route);を呼び出したときには、閉鎖を形成するので。 use関数内のルートは、親関数で変更しても変更されません。試してみてください

app.use(function(req, res, next) { 
    route = require('./routes/second'); 
    app.use('/api', route); 
    next(); 
}); 
+0

私は 'console.log( ) 'ルートファイル内と最初のミドルウェア内部にあります。最初のミドルウェアは実際に最初に実行されます。そして、私は最初のミドルウェアが 'app.use()'の変数を変更できないことを知りました。なぜなら、指定された変数は 'app.listen()'を起動する前に使用され、静的ルートに変換され、 –

+0

うん。クロージャの物や可変範囲については、いつか気づいた。 – kawadhiya21