【问题标题】:node.js - catch error thrown in a mongoose callbacknode.js - 捕捉猫鼬回调中引发的错误
【发布时间】:2016-12-12 04:41:39
【问题描述】:

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

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 中抛出的错误。当然,我无法发现任何错误。我做错了什么?而我应该怎么做?

【问题讨论】:

  • 你应该看看promise。回调的异步错误处理很丑陋。承诺让它变得更加......文明

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


【解决方案1】:

您需要处理回调将在抛出错误很久之前触发的事实,因为它在它自己的回调中。我建议 Promise.all 等待所有返回承诺的保存操作。

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

【讨论】:

  • 您的代码包含一个严重错误,generateInvitations 将在所有保存操作完成之前解决,甚至会引发错误它不会被处理。您必须在那里使用Promise.allPromise.map
  • mongoose 函数返回 Promise,因此您无需创建 Promise 并使用 reject, resolve 回调。只需返回保存函数的结果:promises.push(invitation.save()).
  • @aw04 感谢您的帮助。如果我想在generateInvitations 中保存Invitation 实例怎么办?
  • 你可以像在外面一样做invitation.save().then(data => ...),只是在这种情况下数据只是当前的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-08
  • 1970-01-01
  • 2012-01-27
  • 2014-04-19
  • 2016-05-14
  • 1970-01-01
  • 2016-09-07
相关资源
最近更新 更多