【发布时间】: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 错误。
标签: javascript node.js promise bluebird node-promisify