错误:发送NodeJS猫鼬后无法设置标头?

时间:2018-09-26 13:44:49

标签: node.js mongoose

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

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);
    });
  }
};

1 个答案:

答案 0 :(得分:-2)

是的,这是因为您要返回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);
  });
 }
};