gRPC错误返回,带有意外的详细信息字段

时间:2019-04-15 13:55:04

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

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

我的问题是,传递给C ++端error_details构造函数的grpc::Status参数与客户端收到的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" }
}

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

但是,我确实注意到,我关注的详细信息字段在此(非常简单)的支持下可用:

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

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

1 个答案:

答案 0 :(得分:1)

此处的不同API具有相同基础协议信息的不同表示形式,并且它们碰巧使用的名称冲突。供参考,请参见protocol specification。在该C ++ API中,error_message参数对应于响应的“状态消息”部分,而error_details参数对应于grpc-status-details-bin自定义元数据项。如this comment中所述,其目的是error_details参数将包含序列化的google.rpc.Status原始消息。

在Node API中,details值对应于响应的“ Status-Message”部分(再次是C ++中的error_message参数)。 message值只是一个用户可读的汇总字符串,其中包含状态码,状态码的可读名称和详细信息字符串。正如问题中提到的那样,grpc-status-details-bin元数据项没有特殊的访问器,只是在元数据值中。