场景 :考虑下面的代码从一个节点的Web应用程序的一部分。
app.get('/users/:id?', function(req, res, next){
var id = req.params.id;
if (id) {
// do something
} else {
next(); //or return next();
}
});
问题 :我检查与去哪个只是next()
或return next()
上面的示例代码的工作原理完全两个与没有表现出任何执行差别一样。
问 :能否在此方面的一个放光,什么时候用next()
以及何时使用return next()
和一些重要的区别?
有些人总是写return next()
是为了确保执行触发回调后停止。
如果你不这样做,你就有可能触发回调第二时间后,通常有毁灭性的结果。 你的代码是正确的,因为它是,但我把它改写为:
app.get('/users/:id?', function(req, res, next){
var id = req.params.id;
if(!id)
return next();
// do something
});
它节省了我的缩进级别,当我后来又看了代码,我肯定是没有办法next
被调用了两次。
作为@Laurent佩林的回答:
如果你不这样做,你就有可能触发回调第二时间后,通常有毁灭性的结果
我在这里举个例子,如果你写的中间件是这样的:
app.use((req, res, next) => {
console.log('This is a middleware')
next()
console.log('This is first-half middleware')
})
app.use((req, res, next) => {
console.log('This is second middleware')
next()
})
app.use((req, res, next) => {
console.log('This is third middleware')
next()
})
你会发现,在控制台输出为:
This is a middleware
This is second middleware
This is third middleware
This is first-half middleware
也就是说,它运行下面的next()毕竟中间件功能完成的代码。
但是,如果使用return next()
它会立即跳出回调和下面的代码return next()
回调将是不可到达的。
next()
是的一部分连接的中间件 。 对于路由器流量回调,如果你从你的函数返回什么都不关心,所以return next()
和next(); return;
next(); return;
基本上是相同的。
如果你想停止的功能流程,您可以使用next(err)
像下面
app.get('/user/:id?',
function(req, res, next) {
console.log('function one');
if ( !req.params.id )
next('No ID'); // This will return error
else
next(); // This will continue to function 2
},
function(req, res) {
console.log('function two');
}
);
相当多next()
用于扩展您的要求的中间件。