使用app.use中间件

时间:2015-02-12 17:32:03

标签: javascript node.js express

有什么区别:

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将是未定义的。

2 个答案:

答案 0 :(得分:0)

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.    
             });

这意味着在第一个示例中,setLocale函数仅在路由与/:locale?匹配时调用,而在第二个示例中,使用app.use将始终调用setLocale执行路由回调之前的函数。

不幸req.params app.useapp.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"); });

做到这一点
{{1}}

答案 1 :(得分:0)

问题在于,当您使用app.use(setLocale);时,所有调用都将传递该函数。即使你调用了代码将运行的URL /,然后param将是未定义的。

您拥有的fisrt选项(app.get('/:locale?', setLocale,)当该网址匹配且您可以在该功能中使用locale时,您只使用该功能