节点承诺拒绝不会进入catch

时间:2017-11-22 15:20:37

标签: node.js mongodb es6-promise

我有一个在mongoDB上调用findByIdAndRemove的方法。如果我没有找到id,因此无法从DB中删除它,我想抛出一个错误。

删除仪表板功能:

deleteDashboard = (id) => {
  return Dashboard.findByIdAndRemove(id).exec((err, dashboard) => {
    if (err) return errorHandler.handle('dashboardService', err);
    if (dashboard === null) return Promise.reject({ status: 404, message: 'not found' });

    return Promise.resolve(dashboard);
  });
};

函数调用:

return dashboardService.deleteDashboard(id)
  .then(dashboard => res.status(200).json(dashboard))
  .catch(error => res.status(error.status).json(error));

我不明白为什么使用不在数据库中的id调用dashboardService.deleteDashboard,不会进入catch。在调试时,我检查了它是否已进入if(dashboard === null)条件,因此调用Promise.reject(),然后它进入then而不是catch

1 个答案:

答案 0 :(得分:1)

我认为问题在于:

return Dashboard.findByIdAndRemove(id).exec((err, dashboard) => {

通常在使用promise时,您不会传递回调。尝试将其更改为

deleteDashboard = (id) => {
  return Dashboard.findByIdAndRemove(id).exec()
  .then(dashboard => {
    if (dashboard === null) return Promise.reject({ status: 404, message: 'not found' });
    return dashboard;
  })
  .catch(err => {
    return errorHandler.handle('dashboardService', err);
  })
};

我试图保留大部分代码。刚刚更改了promise的回调,以及catch的错误句柄。