我正在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/