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

我的问题是传递给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

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

最佳答案

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

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

关于c++ - gRPC错误返回,带有意外的详细信息字段,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55690764/

10-12 07:08