我正在使用node + express + MongoDB。
我不明白这个错误。 当我评论next()它很好并且有效但当我使用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();
})
答案 0 :(得分:1)
当您使用res.status或res.send时,请求已结束且函数执行软返回。当你做next()时,你会在中间件和端点链中传递它。所以基本上,你会做双重回报。
因此,该消息告诉您,在将响应返回给客户端后,您无法返回响应。
只有在编写中间件时才需要使用下一个。
答案 1 :(得分:1)
next()
将异步控制传递给链中的下一个中间件。
这是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);
}
})
})
答案 2 :(得分:1)
当您调用下一个函数时,它会在此路由之后调用以下中间件。
在在Video.find中调用回调之前,您正在调用此函数。如果你想下一个呼叫,你必须在回调中进行,如下所示。
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()
})
})