何时使用next()并返回Node.js中的next()

场景 :请考虑以下是节点Web应用程序的部分代码。

app.get('/users/:id?', function(req, res, next){ var id = req.params.id; if (id) { // do something } else { next(); } }); 

问题 :我正在检查哪一个去next()return next() 。 对于上面的代码示例,两个代码的工作原理完全相同,在执行部分中没有任何区别。

问题 :有人可以放下什么时候使用next()什么时候使用return next()和一些重要的区别?

有些人总是写return next()来确保执行在触发callback后停止。

如果你不这样做,你可能会在第二次触发callback的风险,通常具有破坏性的结果。 你的代码很好,但我会重写它为:

 app.get('/users/:id?', function(req, res, next){ var id = req.params.id; if(!id) return next(); // do something }); 

这节省了我一个缩进级别,而且当我稍后再读取代码时,我肯定没有办法next调用next

next()是连接中间件的一部分。 路由器stream程的callback不关心,如果你从你的函数返回任何东西,所以return next()next(); return; next(); return; 基本上是一样的。

如果你想停止function的stream动,你可以使用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()用于扩展请求的中间件。

作为@Laurent Perrin的回答:

如果你不这样做,你可能会在第二次触发callback的风险,通常具有破坏性的结果

我在这里举一个例子,如果你写这样的中间件:

 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 

也就是说,在所有中间件function完成之后,它运行下面的代码()。

但是,如果使用return next() ,它将立即跳出callback,下面的代码return next()callbackreturn next()将无法访问。