gpt4 book ai didi

go - 使用 gRPC 状态包中的 WithDetails() 传递自定义原型(prototype)消息

转载 作者:行者123 更新时间:2023-12-01 21:13:55 25 4
gpt4 key购买 nike

我最近一直在尝试 gRPC 错误处理,并希望将我自己的 proto 消息传递给客户端(定义我自己的错误详细信息和内部错误代码)。在搜索之后,发现了几个使用 gRPC 状态包中的 WithDetails() 来附加自定义元数据的示例。我开始实现如下

gRPC 原型(prototype)消息

message ErrorInfo {
int64 error_code = 1;
string error_message = 2;
string resource_name = 3;
}

服务器端实现
// Frame the error message
st := status.New(codes.NotFound, "object not found")
errInfo := &api.ErrorInfo {
ErrorCode: 100,
ErrorMessage: "Fetching credential failed",
ResourceName: req.GetBackupLocation().GetCloudCredential(),
}
var err error
st, err = st.WithDetails(errInfo)
if err != nil {
// If this errored, it will always error
// here, so better panic so we can figure
// out why than have this silently passing.
panic(fmt.Sprintf("Unexpected error attaching metadata: %v", err))
}

return st.Err()

客户端实现
fmt.Printf("line 76 err :%v", err)
st := status.Convert(err)
for _, detail := range st.Details() {
switch t := detail.(type) {
case *api.ErrorInfo:
fmt.Printf("error code: %v", t.GetErrorCode())
fmt.Printf("error msg: %v", t.GetErrorMessage())
fmt.Printf("resource name: %v", t.GetResourceName())
}
}

当我运行代码时,它命中了在服务器代码中添加的 Panic(),这意味着 WithDetails() 出错了。

为了进一步进行,消除了服务器端的 panic ,此客户端引发以下错误
:any: message type "" isn't linked inerror

问题:
  • WithDetails() 是否仅适用于 googleapis/rpc/errdetails 标准 gRPC 原型(prototype)定义而不适用于自定义原型(prototype)?
  • 查看 proto 文件和代码实现,我没有看到任何特定于 gRPC errdetails 包的内容。
  • 当我尝试使用此包中的 proto 消息时,它工作正常。

  • [注意:我使用的是gogo protobuf]

    任何人都可以告诉我我在这里缺少什么吗?

    最佳答案

    我遇到了类似的错误( any: message type "" isn't linked in *errors.errorString )。就我而言,这是由于 grpc.Status API。

    如果您使用的是 gogo proto,则需要导入/使用
    "github.com/gogo/status"
    代替
    "google.golang.org/grpc/status"

    关于go - 使用 gRPC 状态包中的 WithDetails() 传递自定义原型(prototype)消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61317954/

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