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 回调函数抛出的错误
vue-router点击菜单栏同一个模块报错 ———— Uncaught(in promise) NavigationDuplicated error .......