何时使用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()
将无法访问。