Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Express next()错误_Javascript_Node.js_Express - Fatal编程技术网

Javascript Express 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时,

我正在使用node+express+MongoDB

我不理解这个错误。 当我注释next()时,它可以正常工作,但是当我使用next()时,我得到了一个错误:错误:发送邮件后无法设置邮件头。


使用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。他的用例和遗留代码可能需要它,很难说。