Promise.catch() 不适用于 firebase-admin Node.js SDK

问题描述 投票:0回答:1

例如,auth.getUsers()只允许数组作为参数,因此传递如下所示的字符串将导致错误,但catch子句不会被执行。

import { getAuth } from "firebase-admin/auth";

getAuth().getUsers("foo").catch(() => console.log("error"));

为什么会出现这种情况?

上面在try-catch中可以这样写。在这种情况下,catch 子句将被执行。

import { getAuth } from "firebase-admin/auth";

try {
  getAuth().getUsers("foo");
} catch {
  console.log("error");
}
javascript node.js firebase try-catch firebase-admin
1个回答
0
投票

您显示的两个代码示例不相同。

在第一个示例中,promise 上的 catch 方法仅捕获与该promise 的解决方案特别相关的错误。它不会捕获其他与语言相关的异常(例如编程错误,就像您犯的那样)。这些错误称为“引发的异常”,与被拒绝的承诺不同。如果返回 Promise 的函数存在一些与 Promise 的解决无关的内部问题或崩溃,则 Promise 可能永远不会返回,或者返回的 Promise 可能永远不会得到解决(

then
catch
回调都不是)调用)。

在你的第二个例子中,情况恰恰相反。 try/catch 实际上永远不会捕获对 getUsers 返回的承诺的拒绝,因为它不会等待该承诺解决。但是,它将捕获由 try 块中的任何同步代码引起的一般编程问题和崩溃。

如果您使用 async/await 语法,您的第二个示例将会更有用,这是 try/catch 对使用本机 JS 语法的 Promise 有用的唯一方法。当您使用await时,它会将被拒绝的promise转换为抛出的异常,以便catch子句可以捕获它。此外,您还应该考虑为生成的异常分配一个变量,以便您可以获得有关出错原因的更多信息。

try {
  await getAuth().getUsers("foo");
} catch(e) {
  console.log("error", e);
}

上面将捕获与 javascript 相关的编程错误,以及对 getUsers 返回的承诺的拒绝。由您检查

e
变量来确定它是哪种类型的错误,因为它可能是其中之一。当然,为了使用await,代码本身必须位于异步函数中。

底线:promise 的 catch() 回调与 try/catch 中的 catch 处理程序不同(即使它们具有相同的名称)。

您可能需要查看一些参考文档:

© www.soinside.com 2019 - 2024. All rights reserved.