Я реализую обработку ошибок gRPC на моем сервере C ++, маршруты которого вызываются другим сервером на основе nodejs (который в данном случае фактически является клиентом).
Моя проблема в том, что параметр error_details
, передаваемый конструктору grpc::Status
на стороне C ++, не совпадает с 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
Итак, мой вопрос:
Какого черта?я что-то упустил?