有什么区别:
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将是未定义的。
答案 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.use
在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");
});
{{1}}
答案 1 :(得分:0)
问题在于,当您使用app.use(setLocale);
时,所有调用都将传递该函数。即使你调用了代码将运行的URL /
,然后param将是未定义的。
您拥有的fisrt选项(app.get('/:locale?', setLocale,
)当该网址匹配且您可以在该功能中使用locale
时,您只使用该功能 。