节点与需求未处理的承诺拒绝

时间:2018-11-24 12:28:00

标签: javascript node.js express promise

简化代码:

//文件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中捕获拒绝,但是我更希望它向上游传播并在以后捕获。

1 个答案:

答案 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));
});