node.js - 捕获在mongoose回调中抛出的错误

时间:2016-08-05 17:23:13

标签: javascript node.js mongodb error-handling mongoose

在我的控制器中,我有一个调用另一个函数的终点函数,期望得到一个结果或者从被调用的函数中捕获错误。

exports.createInvites = (req, res) => { 
  // code...

  try {

    generateInvitations(requirements, data => {

      res.status(200).json({data});
    });

  } catch (err) {
    console.log(`caught the error: ${err}`);

    return res.status(500).json(err);
  }
}

在被调用函数generateInvites中,我使用mongoose将生成的对象保存到mongodb,如果有则抛出错误。

function generateInvitations(requirements, cb) {

  const { expirationDate, credits, numOfUse, numOfInvites } = requirements;
  let invitationCodes = [];
  for (let i = 0; i < numOfInvites; i++) {

    const code = randomString(CODE_LENGTH);
    invitationCodes.push(code);

    const invitation = new Invitation({
      // code,
      numOfUse,
      expirationDate,
      credits
    });

    invitation.save((err, obj) => {

      if (err) {
        throw err; // it should throw a ValidationError here
      }
    });
  }
  cb(invitationCodes);

}

以上代码是我尝试处理generateInvites中引发的错误。当然,我没有发现任何错误。我做错了什么?我该怎么做呢?

1 个答案:

答案 0 :(得分:1)

你需要处理这样一个事实,即回调将在抛出错误之前很长时间内发生,因为它是在它自己的回调中。我建议Promise.all等待所有返回promises的保存操作。

function generateInvitations(requirements) {
  const { expirationDate, credits, numOfUse, numOfInvites } = requirements;
  let promises = [];

  for (let i = 0; i < numOfInvites; i++) {
    const code = randomString(CODE_LENGTH);

    const invitation = new Invitation({
      // code,
      numOfUse,
      expirationDate,
      credits
    });

    promises.push(invitation.save());
  }
  return Promise.all(promises):
}

然后:

generateInvitations(requirements)
  .then(data => res.status(200).json({data}))
  .catch(err => {
    console.log(`caught the error: ${err}`);
    return res.status(500).json(err);
  });