Гнездо Js преобразовывает GRP C исключение в исключение HTTP - PullRequest
0 голосов
/ 17 февраля 2020

У меня есть 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)
  }
}
...