簡體   English   中英

在app.use中使用中間件

[英]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.paramsapp.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM