gRPC错误返回了意外的详细信息字段 我在C++服务器中实现GRPC错误处理,它有另一个路由,NoDEJS为基础的服务器(这实际上是客户端)。p> < >我的问题是, > Error细节> PARAM传递给:GRPC::STATE//C>构造器在C++方面与“客户机”接收的 Error细节>代码不相同。p>

gRPC错误返回了意外的详细信息字段 我在C++服务器中实现GRPC错误处理,它有另一个路由,NoDEJS为基础的服务器(这实际上是客户端)。p> < >我的问题是, > Error细节> PARAM传递给:GRPC::STATE//C>构造器在C++方面与“客户机”接收的 Error细节>代码不相同。p>,c++,node.js,error-handling,grpc,C++,Node.js,Error Handling,Grpc,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 { aw

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状态代码作为前缀

不过,我确实注意到,我要查找的详细信息字段可以在以下(非常简单的)道具下使用:


所以我的问题是:

搞什么鬼?我遗漏了什么吗?

这里不同的API对相同的底层协议信息有不同的表示,而且它们使用的名称会发生冲突。有关参考,请参阅。在C++的API中,<代码> ErrRoRoMys> /Cux>参数对应于响应的“状态消息”部分,并且<代码> Error细节> <代码>参数对应于 GRPC状态详细信息bin < /Cord>自定义元数据项。正如在意图中所述,
error\u details
参数将包含一条序列化的
google.rpc.Status
proto消息

在节点API中,
details
值对应于响应的“Status Message”部分(这也是C++中的
error\u Message
参数)。
消息
值只是一个聚合的用户可读字符串,它组合了状态代码、状态代码的人类可读名称和详细信息字符串。如问题中所述,
grpc status details bin
元数据项没有特殊的访问器,它只是在元数据值中

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