简化代码:
//文件A
module.exports = new Promise((res, rej) => {
... do stuff
if (someErr) {
return rej(someErr);
}
return res(stuff)
}
//文件B
const fileA = require('./fileA');
... express stuff
app.get('/getA', (req, res) => {
fileA
.then(data => res.send(data))
.catch(e => res.send(404, e));
});
如您所见,对file B
中的路由运行后继请求时,承诺拒绝被捕获。这样,还可以发送带有原始错误信息谷的404响应。
问题在于,无论何时调用此路由,file A
都会出现 未处理的承诺拒绝 。非常烦人。
(节点:5040)UnhandledPromiseRejectionWarning:未处理的承诺拒绝。引发此错误的原因可能是抛出了一个没有catch块的异步函数,或者是拒绝了一个.catch()无法处理的承诺。 (拒绝ID:1)
(节点:5040)[DEP0018] DeprecationWarning:已弃用未处理的承诺拒绝。将来,未处理的承诺拒绝将以非零退出代码终止Node.js进程。
是的,可以,我可以在file A
中捕获拒绝,但是我更希望它向上游传播并在以后捕获。
答案 0 :(得分:0)
采用您的代码结构方式,拒绝是在.catch
附加到承诺之前引发的,因此从技术上讲,它是在抛出之时未处理的。 。>
我确定您有一个理由要这样构造它(也许只运行一次“做某事” ?),所以可能的解决方法是:
// File A
let promise = null;
module.exports = () => {
if (! promise) {
promise = new Promise((res, rej) => {
... do stuff
if (someErr) {
return rej(someErr);
}
return res(stuff)
});
}
return promise;
};
// File B
app.get('/getA', (req, res) => {
fileA()
.then(data => res.send(data))
.catch(e => res.send(404, e));
});