【问题标题】:Error: Can't set headers after they are sent NodeJS Mongoose?错误:发送 NodeJS Mongoose 后无法设置标头?
【发布时间】:2019-03-02 07:41:11
【问题描述】:

发送后我一直无法设置标头,我认为问题是因为我调用 res.status(400).json 2 次,但除此之外我不知道该怎么做我是节点和猫鼬的新手。

createItem: function (req, res) {
    var item = new Items();
    item.name = req.body.name;
    item.save(err => {
      if (err) {return res.status(400).json({'error': err});}
      for(let i of req.body.subItems){
        var sub = new SubItems();
        sub.name = i.name;
        sub.item = item._id;

        sub.save(err => {
          if (err) {return res.status(400).json({'error': err});}
        })
        item.subItems.push(sub);
        item.save(err => {
          if (err) {return res.status(400).json({'error': err});}
        });
      }
      return res.status(200).send(item);
    });
  }
};

【问题讨论】:

    标签: node.js mongoose


    【解决方案1】:

    是的,这是因为您返回的是res.status(400).json({'error': err});,而不是仅仅在那里完成该功能。通过调用res.status().json() 或调用res.send() 或类似方法已经结束函数并将响应发送给调用者。

    通过在回调中返回它,它将返回到仍在运行的调用函数,并将进入res.status(200).send(item);,但由于您已经将其设置为res.status(400).json({'error': err});,因此标头已经设置,因此将抛出一个错误。

    如前所述,要解决此问题,您可以只写res.status(400).json({'error': err}); 而不返回,因为这只会完成请求。或者,您可以使用next 回调函数并在末尾有一个通用错误处理程序来处理错误。请注意,如果您使用此方法,则必须将next 作为参数添加到createItem function

    代码删除返回

    createItem: function (req, res) {
    var item = new Items();
    item.name = req.body.name;
    item.save(err => {
      if (err) {res.status(400).json({'error': err});}
      for(let i of req.body.subItems){
        var sub = new SubItems();
        sub.name = i.name;
        sub.item = item._id;
    
        sub.save(err => {
          if (err) {res.status(400).json({'error': err});}
        })
        item.subItems.push(sub);
        item.save(err => {
          if (err) {res.status(400).json({'error': err});}
        });
       }
      return res.status(200).send(item);
      });
     }
    };
    

    【讨论】:

    • 感谢您的回复,我更改了我的代码,但我仍然遇到同样的错误,经过一番反思,我认为问题与循环中的 return 'res .status.json' 有关。
    • 我不知道你是否解决了这个问题,但我意识到实际的错误是什么。这是因为您在 if 之后没有使用 else ,这是在回调(即异步)上运行的。所以它将在{res.status(400).json({'error': err});} 之前发送return res.status(200).send(item);,这将在保存该项目后运行
    猜你喜欢
    • 2017-12-22
    • 2018-09-02
    • 2023-04-01
    • 2017-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多