如何检查 TypeScript 中的异常是否为 FirebaseError / FirebaseAuthError

Lap*_*son 7 javascript firebase typescript firebase-authentication

我正在尝试在我们的服务器上使用 TypeScript 实现 Firebase 身份验证和用户创建。

我正在创建一个新用户,并将整个创建内容包装在一个 try-catch 块中。我试图捕获几个异常,其中之一是 Firebase 引发的异常。

问题是我无法检查异常是否是由 Firebase 引发的,或者是否是另一种类型的异常。

类似问题的其他答案建议检查异常是否是 FirebaseError 的实例:

let firebaseUser;
try {
    firebaseUser = await firebase.auth().createUser({
        email: email,
        password: password,
    });

    // Other code here
} catch (error) {
    if(error instanceof FirebaseError){
        // handle FirebaseError here
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是,当 createUser 函数中出现错误时,错误是 FirebaseAuthError 的实例,而不是 FirebaseError,因此此检查失败。

我尝试将其切换到 FirebaseAuthError 并导入 FirebaseAuthError,但收到一条错误消息:

包子路径“./lib/utils/error”未由 \node_modules\firebase-admin\package.json 中的“exports”定义

那么检查 FirebaseAuth 是否抛出捕获的异常的正确方法是什么?

noo*_*ook 5

我认为你能做的最好的事情就是编写一个类型保护,以确保你的错误是一个 FirebaseAuthError ,你将使用 import type 导入它。我查了一下,好像是因为库没有导出。

您可以自由地受益于 firebase 使用的类型,但是,由于该模块未在导出中列出,因此您将无法在运行时使用它。该import type语法允许您在开发期间仍然使用它,但在构建时它将被完全忽略。这意味着您不能使用,instanceof FirebaseAuthError因为仅导入类型,并且不能instanceof在类以外的其他内容上使用。

我不确定以下语句,但我猜想以 为前缀的每个错误auth/似乎都是 FirebaseAuthError。

因此,您可以编写一个类型保护,如下所示:

import type { FirebaseAuthError } from 'firebase-admin/lib/utils/error';


function isFirebaseAuthError(error: FirebaseError): error is FirebaseAuthError {
  return error.code.startsWith('auth/');
}
Run Code Online (Sandbox Code Playgroud)