【问题标题】:gRPC error returns with unexpected details fieldgRPC 错误返回带有意外的详细信息字段
【发布时间】:2019-09-05 12:41:44
【问题描述】:

我正在我的 C++ 服务器中实现 gRPC 错误处理,该服务器具有由另一个基于 nodejs 的服务器(在这种情况下实际上是客户端)调用的路由。

我的问题是在 C++ 端传递给grpc::Status 构造函数的error_details 参数与客户端收到的error_details 不同。

C++ 服务器:

return grpc::Status(
    isError ? grpc::StatusCode::UNKNOWN : grpc::StatusCode::OK,
    "application-specific error code", // the error_message param
    "Extended error details"           // the error_details param
);

NodeJS 客户端:

try {
  await grpc.makeCall({params: 12345})
} catch(err) {
  const { details, message } = err
  console.log({ details, message }); 
  // -> { details: "application-specific error code", message: "2 UNKNOWN application-specific error code" }
  // Expected message:
  // -> { details: "Extended error", message: "application-specific error code" }
}

为了澄清,客户端中的 details 字段包含来自服务器的消息字段,而客户端中的消息字段包含来自服务器的消息字段以及作为前缀的 gRPC 状态代码。

但是,我确实注意到,我所追求的详细信息字段在这个(非常简单的)道具下可用:

err.metadata._internal_repr['grpc-status-details-bin'][0].toString() // Originally a buffer  

所以我的问题是:
有没有搞错?我错过了什么吗?

【问题讨论】:

    标签: c++ node.js error-handling grpc


    【解决方案1】:

    这里的不同 API 对相同的底层协议信息有不同的表示,并且它们碰巧使用了冲突的名称。如需参考,请参阅protocol specification。在该 C++ API 中,error_message 参数对应于响应的“状态消息”部分,error_details 参数对应于grpc-status-details-bin 自定义元数据项。正如this comment 中所述,其意图是error_details 参数将包含一个序列化的google.rpc.Status proto 消息。

    在 Node API 中,details 值对应于响应的“状态消息”部分(这也是 C++ 中的 error_message 参数)。 message 值只是一个聚合的用户可读字符串,它结合了状态代码、状态代码的人类可读名称和详细信息字符串。正如问题中提到的,grpc-status-details-bin 元数据项没有特殊的访问器,它只是在元数据值中。

    【讨论】:

      猜你喜欢
      • 2012-06-30
      • 2019-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-21
      相关资源
      最近更新 更多