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

场景 : 考虑以下是来自节点 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()有什么重要的区别吗?

112411 次浏览

有些人总是写 return next()是为了确保执行在触发回调之后停止。

如果你不这样做,你就有可能在以后再次触发回调,这通常会带来毁灭性的后果。您的代码本来就很好,但我会将其重写为:

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


if(!id)
return next();


// do something
});

它为我节省了一个缩进级别,当我稍后再次阅读代码时,我确信 next不可能被调用两次。

next()连接中间件的一部分。路由器流的回调函数并不关心函数是否返回任何内容,所以 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()基本上用于扩展请求的中间件。

作为@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()的代码将无法访问。

Next ()和 return next ()之间的区别作为另一个编程原则非常简单。下面解释了一些代码行:

    app.use((req, res, next) => {
console.log('Calling first middleware');
next();
console.log('Calling after the next() function');
});




app.use((req, res, next) => {
console.log('Calling second middleware');
return next(); // It returns the function block immediately and call next() function so the return next(); and next(); return; are the same
console.log('After calling return next()');
});


输出是

调用第一个中间件
在 next ()函数之后调用
调用第二个中间件

import express from "express"
  

const app = express()
// API for the testing of next()
app.get(
'/next', function (req,res,next) {
console.log('hi there ');
next();
console.log('you are still here');
}
)
  

// API for the testing of return next()
app.get(
'/return-next', function (req,res,next) {
console.log('hi there');
return next();
console.log('you are still here');
}
)
  

app.listen(5000,()=> {
console.log("App is running on port 5000")
})

/**next**路由中的 next()将调用中间件,在执行中间件之后,它将返回到调用它的位置(与函数调用相同)并执行其余代码

输出 :

hi there


you are still here

/**return-next**路由中,在 next()前面有一个返回,返回控制器

输出 :

hi there

如果你认为 next()像一个函数调用,你可以正确地理解它