我有一个通过 GRPC 连接到网关的 HTTP 服务器。网关还连接到其他 . GRPC 微服务。流程如下所示:
客户端 -> HttpServer -> GRPC 服务器(网关) -> GRPC 微服务服务器 X
我目前处理错误的方式是这样的(如果有更好的做法,请告诉我)为了简洁起见,我只会显示 nessaccery 代码
GRPC 微服务服务器 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})
}
这个简单的向 GRPC 客户端抛出错误(工作正常)
GRPC 服务器
@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)
}
}
Grpc 服务器捕获错误,然后捕获购买全局异常处理程序(这工作正常)
@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 服务器(grpc 客户端,工作正常)
现在,当它到达 Http 服务器时,我希望我可以设置另一个 RPC 异常处理程序并将错误转换为 HTTP 异常。但我不确定是否有可能,我只使用了几天的 Nest,还没有完全理解它。
这是我希望做的一个例子(代码不起作用,只是我想要的例子)。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)
}
}