У меня есть HTTP-сервер, который подключается к шлюзу через GRP C. шлюз также соединяется с другим. GRP C микросервисы. поток выглядит следующим образом:
Клиент -> HttpServer -> GRP C сервер (шлюз) -> GRP C микросервисный сервер X
Способ обработки ошибок в настоящее время выглядит примерно так (пожалуйста, дайте мне знать, если есть лучшая практика) для краткости я покажу только код товара
GRP C сервер микросервиса X
@GrpcMethod() get(clientDetails: Records.UserDetails.AsObject): Records.RecordResponse.AsObject {
this.logger.log("Get Record for client");
throw new RpcException({message: 'some error', code: status.DATA_LOSS})
}
это простые броски ошибка клиенту GRP C (которая работает нормально)
GRP C Сервер
@GrpcMethod() async get(data: Records.UserDetails.AsObject, metaData): Promise<Records.RecordResponse.AsObject> {
try {
return await this.hpGrpcRecordsService.get(data).toPromise();
} catch(e) {
throw new RpcException(e)
}
}
Grp c Сервер перехватывает ошибку, которая в свою очередь поймал купить глобальный обработчик исключений (это прекрасно работает)
@Catch(RpcException)
export class ExceptionFilter implements RpcExceptionFilter<RpcException> {
catch(exception: RpcException, host: ArgumentsHost): Observable<any> {
if( Object.prototype.hasOwnProperty.call(exception, 'message') &&
Object.prototype.hasOwnProperty.call(exception.message, 'code') &&
exception.message.code === 2
){
exception.message.code = 13
}
return throwError(exception.getError());
}
}
Это возвращает ошибку обратно на Http-сервер (grp c клиент, отлично работает)
Теперь, когда это добирается до Http-сервера, я надеялся, что смогу установить другой обработчик исключений RP C и преобразовать ошибку в HTTP за исключением. но я не уверен, возможно ли это, я использовал гнездо только несколько дней, и пока еще не до конца понял.
Вот пример того, что я надеялся сделать (код не работает просто пример того, что я хочу). id предпочитают глобально перехватывать исключения, а не везде блоки try / catch
@Catch(RpcException)
export class ExceptionFilter implements RpcExceptionFilter<RpcException> {
catch(exception: RpcException, host: ArgumentsHost): Observable<any> {
//Map UNKNOWN(2) grpc error to INTERNAL(13)
if( Object.prototype.hasOwnProperty.call(exception, 'message') &&
Object.prototype.hasOwnProperty.call(exception.message, 'code') &&
exception.message.code === 2
){ exception.message.code = 13 }
throw new HttpException('GOT EM', HttpStatus.BAD_GATEWAY)
}
}