处理 Promise 中的错误 - Es6

Posted

技术标签:

【中文标题】处理 Promise 中的错误 - Es6【英文标题】:Handling error in promise - Es6 【发布时间】:2019-01-05 15:39:23 【问题描述】:

我有一个非常简单的代码如下

return Location.findById(locationId)
  .then(doc => 
    if(doc) 
      console.log('Found a matching record.....proceed to delete');
      return Location.remove(_id: locationId);
     else 
      const err = new Error(`$locationId item you wish to delete does not exist!`);
      err.status = 500;
      throw err;
      // return next(err);
    
  )
  .then(deletedDoc => 
    console.log('Record deleted');
    return res.status(200).json(
      message: `$locationId is DELETED`,
      deletedDoc
    );
  )
  .catch(err => 
    console.log("Caught error in catch BLOCK", err);
    return res.status(500).status(
      message: `We are having problems deleting this $locationId!`
    );
  );

从上面的代码可以看出,'then' 抛出了错误。尽管在 'catch' 中捕获了错误,但前端应用程序从未收到来自 'catch' 的任何响应。或者,如果我注释掉“抛出错误”部分并取消注释“返回下一个(错误)”,应用程序工作正常。顺便说一句,我在“app.js”中有一个全局错误处理程序。

app.use((error, req, res, next) => 
res.status(error.status || 500);
  res.json(
    error: 
      handler: 'GLOBAL',
      message: error.message
    
  )
);

我检查了在抛出错误的过程中是否丢失了“res”对象。 console.log(res) 似乎对象完好无损。有趣的是,当我执行上面的代码时,会在 nodeJS 控制台中引发错误,但 POSTMAN 时间已经结束。有人可以解释为什么会出现这种行为并帮助我更好地理解这种情况吗?

顺便说一句,我知道猫鼬中有 findByIDAndRemove 或类似方法。我发现很难继续前进,不理解代码为什么会这样工作。感谢您的所有帮助。

【问题讨论】:

仅供参考,findById() 后跟 .remove() 会受到竞争条件的影响(可以找到对象,但在调用 remove() 之前对其进行修改或删除)。 findByIdAndRemove() 或类似的东西可能是原子的,不受竞争条件的影响。数据库几乎总是首选原子操作。 为什么要从 Postman 运行这段代码,服务器中的日志到底是什么?这是您需要调试并找出您的服务器代码在哪里运行的问题。我在您显示的代码中没有看到任何明显的无法发回响应的内容。当您说它“在 nodeJS 控制台中引发错误”时,您在控制台中看到了什么? 我在控制台中看到的消息是“在 catch BLOCK 中捕获错误”。记录似乎已从数据库中删除。但是邮递员时间到了 【参考方案1】:

您没有从.catch() 块发送响应,因为您使用的是.status() 而不是.json()。改变这个:

return res.status(500).status(
  message: `We are having problems deleting this $locationId!`
);

到这里:

return res.status(500).json(
  message: `We are having problems deleting this $locationId!`
);

【讨论】:

我真是太傻了。当我们不休息并继续编写一些代码时,就会发生这种情况。谢谢。这肯定会解决我的问题。请喝咖啡

以上是关于处理 Promise 中的错误 - Es6的主要内容,如果未能解决你的问题,请参考以下文章

v-on 处理程序中的错误(Promise/async):“TypeError:无法读取未定义的属性“数据””//未定义

我如何知道哪些处理程序在 promise 中抛出错误?

用一级 try ... catch 捕获 JavaScript Promise 中的错误

ES6中的promise

如何处理 promise 的错误?

处理 Promise 执行器函数 ESLint 错误