Javascript Express next()错误
我正在使用node+express+MongoDB 我不理解这个错误。 当我注释next()时,它可以正常工作,但是当我使用next()时,我得到了一个错误:错误:发送邮件后无法设置邮件头。Javascript Express next()错误,javascript,node.js,express,Javascript,Node.js,Express,我正在使用node+express+MongoDB 我不理解这个错误。 当我注释next()时,它可以正常工作,但是当我使用next()时,我得到了一个错误:错误:发送邮件后无法设置邮件头。 使用res.status或res.send时,请求已结束,函数执行软返回。当您执行next()时,您正在中间件和端点链中传递它。所以基本上,你要做双倍回报 因此,该消息告诉您,在将响应返回到客户端之后,您无法返回响应 只有在编写中间件时,才需要使用next。当您使用res.status或res.send时,
使用res.status或res.send时,请求已结束,函数执行软返回。当您执行next()时,您正在中间件和端点链中传递它。所以基本上,你要做双倍回报 因此,该消息告诉您,在将响应返回到客户端之后,您无法返回响应
只有在编写中间件时,才需要使用next。当您使用res.status或res.send时,请求已结束,函数执行软返回。当您执行next()时,您正在中间件和端点链中传递它。所以基本上,你要做双倍回报 因此,该消息告诉您,在将响应返回到客户端之后,您无法返回响应 只有在编写中间件时,才需要使用next。
next()
在express中将异步控制传递给链中的下一个中间件
这就是应该如何使用next
。在中间件链中传递错误
videos.route('/')
.get(function(req, res, next) {
Video.find({},function (err,videosCollection) {
if (err){
console.log(err);
// pass the error along
next(err);
}else if(!videosCollection.length){
// pass a new error along
next(new Error("Videos noz found"));
}else{
console.log("videos found");
// no need to call next
// res.json finishes the connection
res.status(200).json(videosCollection);
}
})
})
express中的next()
将异步控制传递给链中的下一个middlewear
这就是应该如何使用next
。在中间件链中传递错误
videos.route('/')
.get(function(req, res, next) {
Video.find({},function (err,videosCollection) {
if (err){
console.log(err);
// pass the error along
next(err);
}else if(!videosCollection.length){
// pass a new error along
next(new Error("Videos noz found"));
}else{
console.log("videos found");
// no need to call next
// res.json finishes the connection
res.status(200).json(videosCollection);
}
})
})
当您调用下一个函数时,它将在此路由之后调用以下中间件 在Video.find中调用回调之前调用此函数。如果您想调用next,您必须在回调中执行,如下所示
videos.route('/')
.get(function(req, res, next) {
Video.find({},function (err,videosCollection) {
if (err)
{
console.log(err);
}
if(!videosCollection.length)
{
console.log("Videos not found");
}
else
{
console.log("videos found");
res.status(200).json(videosCollection);
}
next()
})
})
当您调用下一个函数时,它将在此路由之后调用以下中间件 在Video.find中调用回调之前调用此函数。如果您想调用next,您必须在回调中执行,如下所示
videos.route('/')
.get(function(req, res, next) {
Video.find({},function (err,videosCollection) {
if (err)
{
console.log(err);
}
if(!videosCollection.length)
{
console.log("Videos not found");
}
else
{
console.log("videos found");
res.status(200).json(videosCollection);
}
next()
})
})
没有什么可以“下一步”去做的。当您发送status/json时,您已经有效地结束了res。”“下一步”仅在您需要将其传递给其他对象时,中间件才需要“下一步”。当您发送status/json时,您已经有效地结束了res。”“Next”仅在需要将其传递给其他对象时才适用于中间件。当在同一请求中调用
res.json
和Next
时,Next将不起作用并引发错误。@PhilPoore Next和res.json是不同的概念。接下来要做的就是移动到第二个中间件,res.json不会干扰这一点。我测试了这段代码,效果很好。发送响应,然后运行第二个中间件。正如其他答案所解释的,next将责任交给下一个中间件看看这个要点:一旦调用了res.json,就不能也不应该将控制权交给下一个中间件。您可以放置一个返回代码>在else中,以阻止其崩溃,但随后它会得到混乱的代码,并且确实需要重新处理。例如,在出现错误或0视频时,连接将控制台。记录错误,但不会按照express约定将其传递给下一个中间件。是的,完全同意,这根本不是最好的方法,但我不想对其中的其余代码做太多假设。我通常不会在路线上使用next。他的用例和遗留代码可能需要它,很难说。如果在同一个请求中调用res.json
和next
,这将不起作用,并且会引发错误。@PhilPoore next和res.json是不同的概念。接下来要做的就是移动到第二个中间件,res.json不会干扰这一点。我测试了这段代码,效果很好。发送响应,然后运行第二个中间件。正如其他答案所解释的,next将责任交给下一个中间件看看这个要点:一旦调用了res.json,就不能也不应该将控制权交给下一个中间件。您可以放置一个返回代码>在else中,以阻止其崩溃,但随后它会得到混乱的代码,并且确实需要重新处理。例如,在出现错误或0视频时,连接将控制台。记录错误,但不会按照express约定将其传递给下一个中间件。是的,完全同意,这根本不是最好的方法,但我不想对其中的其余代码做太多假设。我通常不会在路线上使用next。他的用例和遗留代码可能需要它,很难说。