Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.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 发送头后无法设置头,PUT请求出错_Javascript_Node.js_Express - Fatal编程技术网

Javascript 发送头后无法设置头,PUT请求出错

Javascript 发送头后无法设置头,PUT请求出错,javascript,node.js,express,Javascript,Node.js,Express,每次在指定路由上尝试PUT请求时,我都会收到发送后无法设置头的错误。我不知道这里有什么问题。我也收到了200条回复,但是数据库中的数据没有更新 这是我的密码: episodeRouter.route('/:episodeId/comments/:commentId') .get(Verify.verifyOrdinaryUser, function (req, res, next) { Episode.findById(req.params.episodeId) .pop

每次在指定路由上尝试PUT请求时,我都会收到发送后无法设置头的错误。我不知道这里有什么问题。我也收到了200条回复,但是数据库中的数据没有更新

这是我的密码:

episodeRouter.route('/:episodeId/comments/:commentId')
.get(Verify.verifyOrdinaryUser, function (req, res, next) {
    Episode.findById(req.params.episodeId)
        .populate('comments.postedBy')
        .exec(function (err, episode) {
            if (err) next(err);
            res.json(episode.comments.id(req.params.commentId));
        });
})

.put(Verify.verifyOrdinaryUser, function (req, res, next) {
    // We delete the existing commment and insert the updated
    // comment as a new comment
    Episode.findById(req.params.episodeId, function (err, episode) {
        if (err) next(err);
        episode.comments.id(req.params.commentId).remove();

        req.body.postedBy = req.decoded._id;

        episode.comments.push(req.body);
        episode.save(function (err, episode) {
            if (err) next(err);
            res.json(episode);
        });
    });
})

.delete(Verify.verifyOrdinaryUser, function(req, res, next){
    Episode.findById(req.params.episodeId, function (err, episode) {
        if (err) next(err);
        episode.comments.id(req.params.commentId).remove();
        episode.save(function(err, resp) {
            if (err) next(err);
            res.json(resp);
        });
    });
});
这是我得到的错误:

Error: Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:356:11)
at ServerResponse.header (H:\COURSERA\FULL STACK WEB DEVELOPMENT COURSE\CAPSTONE PROJECT\Capstone Project\watchours\node_modules\express\lib\response.js:719:10)
at ServerResponse.send (H:\COURSERA\FULL STACK WEB DEVELOPMENT COURSE\CAPSTONE PROJECT\Capstone Project\watchours\node_modules\express\lib\response.js:164:12)
at done (H:\COURSERA\FULL STACK WEB DEVELOPMENT COURSE\CAPSTONE PROJECT\Capstone Project\watchours\node_modules\express\lib\response.js:956:10)
at Object.exports.renderFile (H:\COURSERA\FULL STACK WEB DEVELOPMENT COURSE\CAPSTONE PROJECT\Capstone Project\watchours\node_modules\jade\lib\index.js:374:12)
at View.exports.__express [as engine] (H:\COURSERA\FULL STACK WEB DEVELOPMENT COURSE\CAPSTONE PROJECT\Capstone Project\watchours\node_modules\jade\lib\index.js:417:11)
at View.render (H:\COURSERA\FULL STACK WEB DEVELOPMENT COURSE\CAPSTONE PROJECT\Capstone Project\watchours\node_modules\express\lib\view.js:126:8)
at tryRender (H:\COURSERA\FULL STACK WEB DEVELOPMENT COURSE\CAPSTONE PROJECT\Capstone Project\watchours\node_modules\express\lib\application.js:639:10)
at EventEmitter.render (H:\COURSERA\FULL STACK WEB DEVELOPMENT COURSE\CAPSTONE PROJECT\Capstone Project\watchours\node_modules\express\lib\application.js:591:3)
at ServerResponse.render (H:\COURSERA\FULL STACK WEB DEVELOPMENT COURSE\CAPSTONE PROJECT\Capstone Project\watchours\node_modules\express\lib\response.js:960:7)
at H:\COURSERA\FULL STACK WEB DEVELOPMENT COURSE\CAPSTONE PROJECT\Capstone Project\watchours\app.js:91:7
at Layer.handle_error (H:\COURSERA\FULL STACK WEB DEVELOPMENT COURSE\CAPSTONE PROJECT\Capstone Project\watchours\node_modules\express\lib\router\layer.js:71:5)
at trim_prefix (H:\COURSERA\FULL STACK WEB DEVELOPMENT COURSE\CAPSTONE PROJECT\Capstone Project\watchours\node_modules\express\lib\router\index.js:310:13)
at H:\COURSERA\FULL STACK WEB DEVELOPMENT COURSE\CAPSTONE PROJECT\Capstone Project\watchours\node_modules\express\lib\router\index.js:280:7
at Function.process_params (H:\COURSERA\FULL STACK WEB DEVELOPMENT COURSE\CAPSTONE PROJECT\Capstone Project\watchours\node_modules\express\lib\router\index.js:330:12)
at next (H:\COURSERA\FULL STACK WEB DEVELOPMENT COURSE\CAPSTONE PROJECT\Capstone Project\watchours\node_modules\express\lib\router\index.js:271:10)

您的代码存在一些错误/问题:

当出现错误时,您不会退出该函数。正因为如此,您的代码发送了两次响应:第一次有错误,第二次有数据。 你不用承诺。这不是一个bug,但现在是2017年,ES7已经发布,您应该避免使用回调。 经过修正和改进的代码看起来可能是这样的:

.put(Verify.verifyOrdinaryUser, (req, res, next) => {
    Episode
      .findById(req.params.episodeId, (err, episode) => {
        req.body.postedBy = req.decoded._id;

        episode.comments.id(req.params.commentId).remove();
        episode.comments.push(req.body);
        return episode.save();
    })
    .then(episode => res.send(episode))
    .catch(next);
})

@可能是2017年,但你不应该假设OP使用的是最新版本的javascript。“这确实需要努力才能实现。”大卫克尼普:嗯,谁在谈论最新版本?自从两年前v4.0.0发布以来,node.js就在本机上支持承诺,并且从v0.10或更早版本开始就支持bluebird或Q。所以我的答案不是关于新功能,而是关于在编写新代码时使用最佳方法和避免错误。@alexmac这是真的,但肯定还有人还在使用早期版本。大约一年前,我一直在节点0上做一个项目,是异步的,而不是承诺的。我不明白为什么承诺一定比回调好,它们只是一种不同的风格。此外,如果您提供的答案在修复错误的同时重新构造整个脚本,您就有可能让那些不必要地阅读它的人感到困惑。@DavidKnipe您听说过回调吗?如果你没有看到使用承诺的好处,你就不知道什么是承诺以及如何使用承诺。我建议你调查这件事,当你了解他们时,新世界将为你打开,我保证:。那么我的答案呢,我改变了原来的代码,因为它包含了几个反模式,而仅仅修复代码中的错误并不是一个完整的答案。@alexmac一个新的世界将打开?对于我不能用require'async'实现的承诺,您能做什么?我可以并行执行任务,也可以使用依赖项串联执行任务,或者两者之间的任何操作。有一个函数可以创建一个任务队列,任务可以动态添加到该队列中。你认为我只是不熟悉承诺,这是有道理的,但也许是你不熟悉异步。也许你没有意识到我指的是异步npm模块。我仍然认为,解决问题的关键在于回答问题,而其他任何事情,特别是重大重组,都会让人困惑。