【问题标题】:NestJS Microservice Exception handlingNestJS 微服务异常处理
【发布时间】:2020-10-20 04:49:06
【问题描述】:

我已经设置了一个如下所示的微服务架构:

  • api-gateway (NestFactory.create(AppModule);)
  • 服务 1 (NestFactory.createMicroservice<MicroserviceOptions>)
  • 服务 2 (NestFactory.createMicroservice<MicroserviceOptions>) ...

服务看起来像这样:

service.controller.ts
service.handler.ts

handler 类似于处理逻辑的典型单体应用中的服务。

目前,我通过以下方式捕获异常:

  1. 处理程序调用数据库并由于重复键(即电子邮件)而失败。

  2. 我捕获了这个异常并将其转换为RpcException

  3. 在 ApiGateway 中,我像这样捕获RpcException

        return new Promise<Type>((resolve, reject) => {
           this.clientProxy
            .send<Type>('MessagePattern', { dto: DTO })
            .subscribe(resolve, (err) => {
                logger.error(err);
                reject(err);
            });
        });
    
  4. 我必须再次捕获被拒绝的 Promise 和 throw an HttpException 才能让 ExceptionFilter 发送正确的错误响应。在 Promise 中抛出错误而不是拒绝它是行不通的)

所以基本上,我有 3 个 TryCatch 块用于 1 个异常。 这对我来说看起来很冗长。

在 NestJS 微服务方面有没有更好的方法或最佳实践?

我们可以为this.clientProxy.send 接收到的反弹消息设置一个Interceptor 并通过管道将其发送给客户端,而不是显式捕获 2 次吗?

【问题讨论】:

    标签: microservices nestjs


    【解决方案1】:

    不是您问题的完整答案,但总比没有好。 :)

    我尽量避免使用.subscribereject(...) 方法。 尽管send 方法返回Observable,但在大多数情况下,您只希望得到1 个响应。所以,在大多数情况下,.toPromise() 是有道理的。 一旦它是一个承诺,您就可以使用 async-await 语法,并且您没有回调,您可以有效地捕获所有异常(如果您愿意,可以重新抛出)。有点帮助。

    try {
      const payload = { dto: DTO }; 
      const response = await this.clientProxy.send<Type>('MessagePattern', payload).toPromise();
    } catch (err) {
      this.logger.error(err);
    }
    

    在服务器端,您可以有效地定义拦截器,这与您用于 API 控制器的Interceptors 几乎相同。

    @MessagePattern(messagePattern)
    @UseInterceptors(CatchExceptionInterceptor)
    public async someMethod(...) { }
    

    你应该实现NestInterceptor接口:

    @Injectable()
    export class CatchExceptionInterceptor implements NestInterceptor {
        intercept(context: ExecutionContext, stream$: Observable<any>): Observable<any> {
            return stream$.pipe(
                catchError(...)
            );
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-30
      • 2022-06-15
      • 2020-06-09
      • 2018-03-16
      • 1970-01-01
      • 1970-01-01
      • 2021-01-12
      • 1970-01-01
      相关资源
      最近更新 更多