首页 文章

节点未处理的承诺拒绝请求[重复]

提问于
浏览
0

这个问题在这里已有答案:

简化代码:

//文件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响应 .

问题是,无论何时调用路由,都会有 Unhandled Promise Rejection 来自 file A . 很烦人 .

(node:5040)UnhandledPromiseRejectionWarning:未处理的承诺拒绝 . 此错误源于通过抛出异步函数而没有catch块,或者拒绝未使用.catch()处理的promise . (拒绝ID:1)(节点:5040)[DEP0018]弃用警告:不推荐使用未处理的拒绝承诺 . 将来,未处理的承诺拒绝将使用非零退出代码终止Node.js进程 .

是的,当然,我可以在 file A 中捕获拒绝,但我宁愿它在上游传播并稍后捕获它 .

1 回答

  • 0

    通过构造代码的方式,在 .catch 附加到promise之前抛出拒绝,所以从技术上讲,它在抛出时是未处理的 .

    我确定你有理由为什么要这样构造它(也许只运行"do stuff"一次?),所以一个可能的解决方法是:

    // 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));
    });
    

相关问题