gpt4 book ai didi

javascript - 为什么我得到 "UnhandledPromiseRejectionWarning"?

转载 作者:行者123 更新时间:2023-11-30 19:29:24 26 4
gpt4 key购买 nike

我正在尝试调用一个异步方法。异步方法是:

async connect() {
this.pool = await mysql.createPool(this.conf);
await this.pool.getConnection().catch((err) => { throw new Error(err) });
}

调用这个方法的代码是:

(async () => {
await db.connect()
.catch((err) => {
console.error(`Database connection error: ${err.message}`);
throw new Error(err);
});
})();

但是,当 this.pool.getConnection() 中发生错误时,我收到以下警告:

[Thu Jun 13 2019 23:10:59] [ERROR]  (node:18296) UnhandledPromiseRejectionWarning: Error: Error: Access denied for user 'root'@'localhost' (using password: YES)
at pool.getConnection.catch
at process._tickCallback
[Thu Jun 13 2019 23:10:59] [ERROR] (node:18296) UnhandledPromiseRejectionWarning: Unhandled promise rejection. 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(). (rejection id: 1)
[Thu Jun 13 2019 23:10:59] [ERROR] (node:18296) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

阅读了类似问题的答案后,我明白必须处理来自 Promises 的拒绝,但我不知道我在哪里没有正确处理这个问题。 this.pool.getConnection() 调用有一个 catch block ,我在其中抛出错误,以便将其传递给匿名调用函数进行处理。

我尝试了此代码的几种变体,包括向匿名函数本身添加一个 catch block 并在那里再次抛出错误,但似乎没有任何效果,并且警告始终源自 this.pool.getConnection() 调用.

我想要实现的是将 connect() 方法中发生的任何错误传递给匿名函数来处理。

我哪里错了?提前致谢。

编辑:有趣的是,如果我按如下方式编写 this.pool.getConnection() 行(catch block 中没有任何内容),警告就会消失:

await this.pool.getConnection().catch((err) => {});

当我尝试在箭头函数内做任何事情时,例如将错误分配给变量,警告重新出现。

最佳答案

在此代码中,您没有处理错误:

(async () => {
await db.connect()
.catch((err) => {
console.error(`Database connection error: ${err.message}`);
throw new Error(err);
});
})();

如果 db.connect() 拒绝,那么您的 .catch() 将被调用并重新抛出。这意味着 await db.connect() 将看到一个被拒绝的 promise ,并且您的包装异步函数将返回一个您没有处理程序的被拒绝的 promise 。因此,您会收到未处理的拒绝。

您可以这样做,以便错误完全在您的 async 函数中处理,因此永远不会返回被拒绝的 promise ,或者您可以正确处理错误。

仅供引用,将 await.catch() 混合使用也很奇怪(通常不推荐)。通常您将 .then().catch() 一起使用,并将 awaittry/catch 一起使用。


如果您想要的所有错误处理都是记录错误并避免警告,那么您可以更改为:

db.connect().catch((err) => {
console.error(`Database connection error: ${err.message}`);
// put any other required error handling here
});

通过删除 throw err,您可以在本地“处理”错误,因此不会出现未处理的拒绝。您在这里遇到的唯一拒绝已得到处理。另外,请注意似乎不需要 asyncawait,因为您只是进行函数调用并处理任何异常。


注意,设计模式:

async function foo() {
await f();
}

几乎相同于:

function foo() {
return f();
}

唯一不同的地方是如果 f() 没有返回一个 promise 或同步抛出,这两种情况都不应该在一个行为正确的返回 promise 的 API 中发生。

因为我更喜欢用最简单的代码表达来实现你的目标,所以我宁愿不使用 async/await,除非它确实可以帮助你简化代码。

关于javascript - 为什么我得到 "UnhandledPromiseRejectionWarning"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56589272/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com