表示next()错误

时间:2017-01-09 19:48:47

标签: javascript node.js express

我正在使用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();
    })

3 个答案:

答案 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()
    })
})