Ошибка gRPC возвращается с неожиданным полем данных - PullRequest
1 голос
/ 15 апреля 2019

Я реализую обработку ошибок 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  

Итак, мой вопрос:
Какого черта?я что-то упустил?

1 Ответ

1 голос
/ 18 апреля 2019

Разные API здесь имеют разные представления одной и той же информации базового протокола, и они используют имена, которые конфликтуют.Для справки см. Спецификацию протокола .В этом C ++ API параметр error_message соответствует части ответа «Status-Message», а параметр error_details соответствует элементу пользовательских метаданных grpc-status-details-bin.Как указано в этом комментарии , предполагается, что параметр error_details будет содержать сериализованное прото-сообщение google.rpc.Status.

В API-интерфейсе узла значение details соответствует значению "Status-Message "часть ответа (который, опять же, был параметром error_message в C ++).Значение message - это просто совокупная читаемая пользователем строка, которая объединяет код состояния, удобочитаемое имя кода состояния и строку сведений.Как упоминалось в вопросе, элемент метаданных grpc-status-details-bin не имеет специального средства доступа, он просто находится в значении метаданных.

...