Promise 在应该捕获错误时解决

Posted

技术标签:

【中文标题】Promise 在应该捕获错误时解决【英文标题】:Promise resolves when it should be catching error 【发布时间】:2020-01-11 14:35:40 【问题描述】:

我有一个简单的 node+express 应用程序,如果您访问某个页面,它会发出一些异步 http/get url 请求。这是为了简单地从数据库中获取一些数据,并将其发送到视图。使用标准单独的routes.js 文件处理路由。

routes.js

...
const bluebird = require('bluebird');
const promiseRequest = bluebird.promisify(require('request'));

Promise.all([
  promiseRequest(`http://url1...`),
  promiseRequest(`http://url2...`)
])
.then((promiseRes) => 
  res.render(...); // loads the view for the client
)
.catch((err) => 
  errorHandler(err, req, res); // to be handled by express middleware
);

http url 请求使用控制器文件处理,该文件对数据库进行查询,并返回值或错误。

controller.js

try 
  const rows, rowCount = await db.query(findAllQuery);
  return res.status(200).send(rows, rowCount);
 catch (error) 
  return res.status(400).send(
    "name": error.name,
    "psql_error_code": error.code
  );

控制器工作正常,但我故意输入了错误的 get url,以便控制器将 res.status(400)... 对象返回到路由。无论我返回什么路线,承诺都会解决。我什至尝试返回 new Error('Error description'),但 promisify 将其作为解决方案接收。

任何帮助将不胜感激!

--

控制器对路由的响应是lengthy object。

【问题讨论】:

你没想到的promiseRes 的值是多少? promiseRes 总是返回一些东西,使得 catch(err) 永远不会触发,即使 promise 返回一个错误。我是否必须定义 promiseRes 应该寻找什么? 在 promiseRes 中,我基本上有一个 if 语句过滤 if promiseRes[0].name == 'error' 然后抛出一个错误。但是 catch 不应该原生处理吗? 400 状态是“错误”吗?你能检查你的结果的http状态吗? @SamSverko 是的,promiseRes 确实有一些价值,这就是catch 没有触发的原因。如果您可以向我们展示您确实收到并记录的值,我们可能会告诉您为什么该值被认为是结果并且request 不认为是错误,尽管您声称您发送了 400 错误。 【参考方案1】:

因为我看不到你是如何实现 errorHandler() 的。我能想到的你应该寻找的一件事是 - 如果在被调用的 promise 的 .catch(err) 内你没有返回任何错误,它将转到调用函数的 then。

【讨论】:

以上是关于Promise 在应该捕获错误时解决的主要内容,如果未能解决你的问题,请参考以下文章

未捕获从 mongoose-promise 回调函数抛出的错误

复杂承诺返回链中的承诺 catch() 顺序

vue-router点击菜单栏同一个模块报错 ———— Uncaught(in promise) NavigationDuplicated error .......

React setState 未能捕获被拒绝的 Promise

AngularJS Promise 错误捕获

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