如何使用 Firebase admin sdk for Go 处理错误?

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

Go 新手,尝试了解如何访问错误详细信息。我已经创建了一个用户,现在我期望收到“电子邮件已存在”错误:

    fbUser, err := s.auth.CreateUser(ctx, fbUserParams)
    if err != nil {
        return nil, errors.New("[email] already exists") // <- it could be any other error, and I want to be able to handle it
    }

这是我在调试器中看到的内容:

我该如何处理错误以便从中获取代码?

firebase go firebase-authentication
2个回答
3
投票

我认为最好的选择是使用

Errors.As
功能。您可以在这里了解更多信息:https://pkg.go.dev/errors#As
Google Firebase 返回的错误属于
FirebaseError
类型,涉及两个属性:
Code
String
。您可以尝试使用以下代码片段:

fbUser, err := s.auth.CreateUser(ctx, fbUserParams)
if err != nil {
    var firebaseErr *FirebaseError
    if errors.As(err, &firebaseErr) {
        // here you can access "Code" and "String"
    } else {
        return nil, errors.New("[email] already exists")
    }
}

感谢这段代码,您应该能够管理您需要的内容。注意正确导入提供

FirebaseError
类型的包。也许先阅读 Firebase 文档上的一些内容。
希望这有帮助!


0
投票

聚会有点晚了,但今天我发现自己处于同样的情况。这是你可以做的。

一些背景:本文档指出

Go Admin SDK 提供了一个 errorutils 包,其中包含 一系列允许测试错误代码的函数

有像

IsInvalidArgument(err error)
IsNotFound(err error)
这样的函数,它们都返回 bool 值。

同一份文件指出

公开服务错误代码的 API 提供特定于 API 的错误 检查相应包中的功能。

在您的情况下,它是 auth 包,因此您将考虑名称以

auth.Is...
开头的函数。例如
auth.IsCertificateFetchFailed(err)
auth.IsUserNotFound(err)

在代码中执行此操作的一种方法是处理您希望考虑的情况。可能是这样的

if err != nil {
    if auth.IsCertificateFetchFailed(err) {
        return errors.New("Certificate Fetch Failed")
    } else if auth.IsConfigurationNotFound(err) {
        return errors.New("Configuration Not Found")
    } else if auth.IsEmailAlreadyExists(err) {
        return errors.New("Email Already Exists")
    } // ...else if.. and so on, dependng on your needs and patience :)
    
    return err  // for any unmanaged case
}

当然,您可以在此模式上创建更通用的函数。

坦白说,我更喜欢一个更简单的解决方案,比如能够以某种方式转换为 Firebase 错误,但这就是生活,这就是 SDK 提供的。

同样具有讽刺意味的是,Firebase 的父辈们公开了 .Net 中的错误代码,而不是他们自己的编程语言:)

我希望这有帮助。

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