首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在node.16上开玩笑: ERR_UNHANDLED_REJECTION

在node.16上开玩笑: ERR_UNHANDLED_REJECTION
EN

Stack Overflow用户
提问于 2021-12-09 00:40:50
回答 1查看 9.5K关注 0票数 2

我的单元测试代码如下:

代码语言:javascript
运行
复制
// function for my unit test to test exception
const mockServiceThrow = async () => { throw new Error('unit test error message'); };

const createContextAndDoc = () => new Promise((resolve, reject) => {
  (async () => {

    const res = await mockServiceThrow();

    if (res === 1) resolve(1)
    else reject(0);
  })();
});

createContextAndDoc().catch((e) => {
  console.log('--------');
  console.log(e.message);
  console.log('--------');
});

当我运行这个单元测试时:

代码语言:javascript
运行
复制
./node_modules/.bin/jest local_modules/__test__/unhandledException.test.js 

完整的输出如下:

代码语言:javascript
运行
复制
 RUNS  local_modules/__test__/unhandledException.test.js
node:internal/process/promises:246
          triggerUncaughtException(err, true /* fromPromise */);
          ^

[UnhandledPromiseRejection: This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). The promise rejected with the reason "Error: unit test error message".] {
  code: 'ERR_UNHANDLED_REJECTION'
}

不明白为什么上面写着“未处理”,我有.catch()。有什么建议吗?

EN

Stack Overflow用户

回答已采纳

发布于 2021-12-09 01:15:55

看起来您正在立即调用异步函数,这会导致单元测试错误,这是不可能的,因为承诺永远不会返回-因此.catch没有捕获任何内容。错误不是承诺链的一部分。

如果您想立即调用函数,您需要捕捉错误并拒绝它,这样承诺就完成了。

代码语言:javascript
运行
复制
const mockServiceThrow = async () => { throw new Error('unit test error message'); };

const createContextAndDoc = () => new Promise((resolve, reject) => {
  (async () => {
    try {
      const res = await mockServiceThrow();

      if (res === 1) resolve(1)
      else reject(0);
    } catch (e) {
      reject(e)
    }
  })();
}); 

  createContextAndDoc().catch(e =>  {
    console.log('------------------');
    console.log(e.message);
    console.log('--------')
  })

您还可以稍微简化代码:

代码语言:javascript
运行
复制
const mockServiceThrow = async () => { throw new Error('unit test error message'); };

const createContextAndDoc = async () => {  
    const res = await mockServiceThrow();

    if(res === 1) {
      return Promise.resolve(1)
    } else {
      return Promise.reject(0);
    }  
};

createContextAndDoc().catch(e =>  {
    console.log('------------------');
    console.log(e.message);
    console.log('--------')
})

编辑:进一步解释承诺。

createContextAndDoc是一个返回承诺的函数。如果res === 1,则该承诺将解决,但如果res是其他内容,则拒绝接受。为了实现这一目标,mockServiceThrow承诺的问题必须得到解决。否则,您将无法获得res variable.If的任何值,这样您的承诺函数就永远不会满满(解决或拒绝)。

在您的示例中,mockServiceThrow失败并抛出一个错误,此错误不是您用新Promis创建的承诺的一部分。要确保您的承诺完成(解决或拒绝),您需要回调,否则错误并不是承诺的一部分。

简化的代码有一个异步函数,这样当mockServiceThrow失败时,它的一部分异步函数就是您想要捕获的。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70283416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档