Scenario:考虑以下来自节点web应用程序的代码部分。
app.get('/users/:id?', function(req, res, next){
var id = req.params.id;
if (id) {
// do something
} else {
next(); //or return next();
}
});
Issue:我正在检查只使用next()
还是return next()
的版本。上面的示例代码在这两种情况下的工作方式完全相同,没有显示出任何执行上的差异。
Question:有人能说明一下这个问题吗?什么时候使用next()
,什么时候使用return next()
以及一些重要的区别?
发布于 2013-05-29 18:53:14
有些人总是写return next()
是为了确保在触发回调后停止执行。
如果您不这样做,您可能会在稍后再次触发回调,这通常会产生破坏性的结果。您的代码没有问题,但我会将其重写为:
app.get('/users/:id?', function(req, res, next){
var id = req.params.id;
if(!id)
return next();
// do something
});
它为我节省了缩进级别,当我稍后再次阅读代码时,我确信next
不可能被调用两次。
发布于 2017-04-14 10:01:22
正如@Laurent Perrin的回答:
如果您不这样做,您可能会在稍后再次触发回调,这通常会产生破坏性的结果
如果你像这样编写中间件,我在这里给出一个例子:
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()
下面的代码将无法访问。
发布于 2013-05-29 19:01:30
next()
是connect middleware的一部分。路由流的回调并不关心您是否从函数中返回任何内容,因此return next()
和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()
在很大程度上用于扩展请求的中间件。
https://stackoverflow.com/questions/16810449
复制相似问题