当前位置: 首页 > 知识库问答 >
问题:

处理拒绝promise的问题

洪光霁
2023-03-14

我有以下验证函数检查用户是否存在:

validate.user = async (user, password) => {
    const matches = await bcrypt.compare(password, user.password);
    if (matches) return user;
    if (!matches) {
        return validate.logAndThrow('User password does not match');
    }
    return validate.logAndThrow('Error in bcrypt compare');
};

以下使用Chai的测试应对此进行测试:

chai.use(sinonChai);
const { expect } = chai;

    describe('#user', () => {
        it('show throw if user is undefined', () => {
            expect(() => validate.user(undefined, 'pass')).to.throw('User does not exist');
        });

错误确实会被抛出,但是mocha在控制台中显示以下内容:

2)显示抛出,如果用户是未定义的(节点: 18587)UnhandledPromiseRejse警告:未处理的promise拒绝(拒绝id: 2):错误:用户不存在

所以我的问题是,我如何重写测试,让它捕捉到promise拒绝?

共有2个答案

贺自明
2023-03-14

我不完全确定是摩卡咖啡抛出了未经处理的拒绝。

我认为你的bcrypt.compare本质上是异步的,使用回调。wait不能真正在异步函数中开箱即用。

但是,您可以使用节点util库提示异步调用,如下所示:

const util = require('util');
const bcrypt = require('bcrypt');

const bcryptCompare = util.promisify(bcrypt.compare);

现在你可以使用wait bCryptCompare(密码,user.password);就像你想的那样。

另外,要使用async/await处理拒绝,您应该像这样使用try/catch

let matches;
try {
    matches = await bcryptCompare(password, user.password);
} catch(bcryptError) {
    throw new Error(bcryptError);
}
柯伟志
2023-03-14

要测试基于promise的函数(异步),请使用chai作为promise插件:

expect(validate.user(undefined, 'pass')).to.be.rejectedWith(Error, 'User does not exist');

在这种情况下,你不把()=

我希望这是清楚的:)如果你有任何问题-随时问。

 类似资料:
  • 我得到这个错误- (节点:18420)未处理的PromisejectionWarning:TypeError:无法读取未定义的属性“name” (节点:18420)未处理的PromisejectionWarning:未处理的promise拒绝。此错误源于在没有catch块的情况下抛出异步函数的内部,或者拒绝使用未处理的promise。catch()。要在未处理的promise拒绝时终止节点进程,请

  • 我想在Repl上为我的游戏实现一个基本的排行榜。它,所以我创建了一个节点。js后端。这是我在后端的配置: 但是每当我尝试发布时,我都会得到以下错误: (节点:344)未处理的PromisejectionWarning:TypeError:无法读取null的属性“push” (节点:344)UnhandledPromiseRejtionWarning:未处理的promise拒绝。这个错误要么是由于抛

  • 我正在与节点JS中的promise模式作斗争 我在db中寻找用户,然后用用户引用保存新实体,但当用户不在db中时,我应该返回拒绝,但我不确定如何正确地做到这一点。 有什么办法可以做得更好吗? btw:对不起,coffeescript :-[

  • 为了学习角度2,我正在尝试他们的教程。 我得到这样的错误: 我在SO中浏览了不同的问题和答案,但没有发现什么是“未处理的promise拒绝”。 有人能简单地解释一下它是什么,以及<code>错误:生成cmd ENOENT</code>是什么,当它出现时,我需要检查什么才能消除这个警告吗?

  • 本文介绍了单个promise组合器: 但我没有看到的是,一种运行所有promise的方法,但不是在个人promise被拒绝时短路。我如何确保所有的promise都得到履行,但我能处理拒绝和所有promise的解决?

  • 当我运行部署我的应用程序的命令时,我发现以下错误 (节点: 6292)UnhandledPromiseRejtionWarning: UnHandledPromiseRejtionWarning: UnHandledPromiseRejtionWarning: UnHandledPromiseRejtionWarning: UnHandledPromiseRejtionWarning: UnHan