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
}
这是我在调试器中看到的内容:
我该如何处理错误以便从中获取代码?
我认为最好的选择是使用
Errors.As
功能。您可以在这里了解更多信息:https://pkg.go.dev/errors#AsFirebaseError
类型,涉及两个属性: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 文档上的一些内容。聚会有点晚了,但今天我发现自己处于同样的情况。这是你可以做的。
一些背景:本文档指出
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 中的错误代码,而不是他们自己的编程语言:)
我希望这有帮助。