未处理的承诺拒绝错误:发送邮件后无法设置标头

时间:2017-04-12 09:55:38

标签: javascript node.js mongodb mongoose promise

我想做一个if else返回(对于conrtole)但是:" UnhandledPromiseRejectionWarning:未处理的promise promise(拒绝id:1):错误:发送后不能设置标头。 "

exports.delete = function (req, res) {
  Parking.findById(req.params.id).exec()
    .then(function (parking) {
      if (userController.ensureAuthorized(req, 'Director', parking.id)) {
        return parking;
      }
      return res.status(403).send({msg: 'unauthorized'});

    })
    .then(function (parking) {
      User.update().exec();
      return parking;
    })
    .then(function (parking) {
       return Parking.remove({_id: parking._id}).exec();
    })
    .then(function () {
      res.status(200).json({msg: 'Ok ! Parkink remove'});
    })
    .catch(function (err) {
      return res.status(400).send(err);
    });
};

3 个答案:

答案 0 :(得分:1)

问题是在return res.status(403)之后,承诺链不会自动停止。最终,它会点击res.status(200)并导致错误。

您可以稍微重写您的承诺链以防止这种情况发生。我不确定User.update().exec()的用途是什么,但我认为您想要调用它并等待其承诺在继续之前得到解决:

exports.delete = function (req, res) {
  Parking.findById(req.params.id).exec()
    .then(function (parking) {
      if (userController.ensureAuthorized(req, 'Director', parking.id)) {
        return User.update(...).exec().then(function() {
          return Parking.remove({_id: parking._id}).exec();
        }).then(function() {
          return res.status(200).json({msg: 'Ok ! Parkink remove'});
        });
      } else {
        return res.status(403).send({msg: 'unauthorized'});
      }
    }).catch(function (err) {
      return res.status(400).send(err);
    });
};

答案 1 :(得分:0)

breaking the promise chain没有标准的方式。

所以我要抛出一个错误来打破链,然后处理那个自定义抛出的错误:

exports.delete = function (req, res) {
  Parking.findById(req.params.id).exec()
    .then(function (parking) {
      if (userController.ensureAuthorized(req, 'Director', parking.id)) {
        return parking;
      }
      else {
        res.status(403).send({msg: 'unauthorized'});
        throw new Error('BREAK_CHAIN'); //      <-- intentionally throw error
      }
    })
    .then(function (parking) {
      User.update().exec();
      return parking;
    })
    .then(function (parking) {
       return Parking.remove({_id: parking._id}).exec();
    })
    .then(function () {
      res.status(200).json({msg: 'Ok ! Parkink remove'});
    })
    .catch(function (err) {
        if(err.message != 'BREAK_CHAIN')    //      <-- handle if error was intentionally thrown
            return res.status(400).send(err);
    });
};

答案 2 :(得分:0)

作为对其他答案的补充,我建议:

1)将事情分解成小部分

2)按预期使用throw,以引发非授权错误

function update (parking) {
  User.update().exec()
    .then(function () {
      Parking.remove({_id: parking._id}).exec();
    });
}

exports.delete = function (req, res) {
  // auth needs req so we put it in scope
  var auth = function (parking) {
    if (!userController.ensureAuthorized(req, 'Director', parking.id)) {
      throw(new Error(403));
    }
    return parking;
  }

  Parking.findById(req.params.id).exec()
    .then(auth)
    .then(update)
    .then(function () {
      res.status(200).json({msg: 'Ok ! Parkink remove'});
    })
    .catch(function (err) {
      if (err.message === 403) {
        return res.status(403).send({msg: 'unauthorized'});
      }
      return res.status(400).send(err);
    });
};