如何处理Nestjs中的GRPC错误
#node #microservices #nestjs #grpc

Nestjs在GRPC方面特别是创建微服务的好方法!您可以在Nestjs应用程序中轻松使用GRPC而不进行额外工作。

错误处理:基本解决方案

在微服务中正确处理错误确实很重要。 Nestjs为此提供 rpcexception 。让我们看一些代码:

// user-service/src/find-user.query.ts

export class FindUserQuery implements IQuery {
    async execute(params: FindUserQueryParam): Observable<User> {
        const user = await this.repository.findOne({ id: params.id });

        if(!user) {
            throw new RpcException("User Not Found.");
        }

        return of(user);
    }
}

此示例代码显示了如何抛出与微服务相关的异常。尽管这可以正常工作,但是有问题!如果要发送HTTP错误,这将无济于事,因为您实际上不知道这是什么类型的错误。

我们都知道 404 是A 找不到错误,但GRPC使用 5 。另一方面,由于 rpcexception 不仅适用于GRPC(无论您使用哪种运输方法,您都可以使用此例外),因此客户端不会知道这是 代码5 错误。

有效的GRPC错误处理

要解决解释的问题,您必须传递包含GRPC错误代码的对象。但是让我保存你!

我发布了一个库,为 rpcexception 提供了一些包装。它几乎包括所有常用的GRPC错误代码。该库提供了2个主要功能:

  • 与内置的Nestjs类似的异常类
  • 在客户端中,GRPC错误从微服务服务器自动转换为 httpexception

如何使用图书馆?

首先使用您喜欢的任何软件包管理器安装库。

npm i nestjs-grpc-exceptions

然后将 grpcserverexceptionfilter 添加到您的GRPC服务器:

import { Module } from "@nestjs/common";
import { APP_FILTER } from "@nestjs/core";
import { GrpcServerExceptionFilter } from "nestjs-grpc-exceptions";

@Module({
  providers: [
    {
      provide: APP_FILTER,
      useClass: GrpcServerExceptionFilter,
    },
  ],
})
export class UserModule {}

将客户端拦截器添加到您的客户端:

import { GrpcToHttpInterceptor } from 'nestjs-grpc-exceptions';

@Get(':id')
@UseInterceptors(GrpcToHttpInterceptor)
function findUser(@Param('id') id: number): void;

现在您可以使用服务器中的异常类:

import {
  GrpcNotFoundException,
  GrpcInvalidArgumentException,
} from "nestjs-grpc-exceptions";

throw new GrpcNotFoundException("User Not Found.");
throw new GrpcInvalidArgumentException("input 'name' is not valid.");

这就是您所需要的。

有用的链接:

希望您无BUG代码! €