November 28th, 2019

Codded

GRPC: обработка ошибок на клиенте

Разрабатывая сервис на GO с GRPC встал вопрос при описании proto файлов "Нужно ли вносить описание ошибки приложения в ответ?". Изначально я так и сделал. Определил новый тип Error и добавил его первым полем во все ответы, получилось так:

message Error {
message Metadata {
string key = 1;
string value = 2
}
string code = 1; // код ошибки, константа
string message = 2; // сообщение об ошибке
string detail = 3; // дополнительные данные об ошибке, пояснения 
repeated Metadata meta = 4; // метаданные в виде ключ=значение
}
message ConfigStatusAnswer {
// Данные ошибки. Заполнено в случае ошибки выполнения запроса
Error error = 1;
// дата последнего изменения конфигурации
google.protobuf.Timestamp last_changed_time = 2;
// контрольная сумма конфигурации (опционально)
string checksum = 3;
}

Вроде бы логично. Но я решил все таки посмотреть, как это рекомендуют делать разработчики gRPC.
Оказалось они предлагают не вносить это информацию в каждый ответ, а вписывать ее в метаданные и оттуда клиент их должен достать. Меня интерисовало также как это будет выглядеть в коде на TypeScript, т.к. мы используем Improbable grpc-web для публикации API и он умеет работать с TypeScript. В нашем проекте один из клиентов это одностраничик (SPA) на Vuejs, похоже на это пример в статье "A TODO app using grpc-web and Vue.js (12.2018)"

Как же создавать ошибки на сервере (Go) и обрабатывать их на клиенте (TypeScript) тогда?

Collapse )