[英]Using middleware with app.use
之間有什么區別?
function setLocale(req, res, next) {
req.params.locale = req.params.locale || 'pt';
res.cookie('locale', req.params.locale);
req.i18n.setLocale(req.params.locale);
console.log(req.params.locale);
next();
}
app.get('/:locale?', setLocale, function(req, res) {
res.render("index");
});
和這個:
app.use(setLocale);
function setLocale(req, res, next) {
req.params.locale = req.params.locale || 'pt';
res.cookie('locale', req.params.locale);
req.i18n.setLocale(req.params.locale);
console.log(req.params.locale);
next();
}
app.get('/:locale?', function(req, res) {
res.render("index");
});
??
只有第一個有效,如果我嘗試使用app.use,則代碼將中斷,因為req.params.locale將不確定。
app.use
會將中間件添加到堆棧中,並在處理每個請求之前始終使用中間件,而與路由,方法等無關。
在第一個示例中,中間件僅作為回調函數添加到該路由,因為app.get
接受多個回調,並調用next
移動到下一個回調等
app.get('/', function(req, res, next) {
next(); // move to next
}, function(req, res, next) {
// continues here when next() is called in previous callback etc.
});
這意味着在第一個示例中,僅當路由與/:locale?
匹配時才調用setLocale
函數/:locale?
,而在第二個示例中,使用app.use
將始終在執行路線回調之前調用setLocale
函數。
不幸的是, req.params
在app.use
不可用,因為它取決於路由器,並在以后添加,因此您可能會陷入將函數作為對每個路由的回調的app.all('*')
,並且可以使用app.all('*')
function setLocale(req, res, next) {
req.params.locale = req.params.locale || 'pt';
res.cookie('locale', req.params.locale);
req.i18n.setLocale(req.params.locale);
next();
}
app.all('*', setLocale);
app.get('/:locale?', function(req, res) {
res.render("index");
});
問題是當您使用app.use(setLocale);
您所有的呼叫都會傳遞給該函數。 即使您調用url /
,該代碼也會運行,然后param將是未定義的。
您擁有的app.get('/:locale?', setLocale,
選項( app.get('/:locale?', setLocale,
)) 僅在該URL匹配並且在函數內部可以使用locale
時才使用該函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.