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代码! €