NestJS gRPC 请求参数验证

问题描述 投票:0回答:1

我正在尝试对发送到使用 NestJS 构建的 gRPC 服务的请求进行参数验证,这就是我的示例方法的样子:

@GrpcMethod('Service', 'Method')
methodName(request: Request, _metadata: Metadata, call: ServerWritableStreamImpl<Request, Observable<Response>>) {
    ...
}

我们使用 proto 文件来定义请求和响应接口。

如何验证请求参数并返回/抛出异常,例如BAD_REQUEST 代码?

到目前为止我已经尝试过:

validation parameters request nestjs grpc
1个回答
0
投票

您可以创建自定义装饰器来使用

class-validator
和 DTO 验证输入参数。尝试一下:

import * as grpc from '@grpc/grpc-js';
import { RpcException } from '@nestjs/microservices';
import { plainToInstance } from 'class-transformer';
import { validate } from 'class-validator';

export function ValidateGrpcInput(dtoClass: any) {
  return function (
    target: any,
    methodName: string,
    descriptor: PropertyDescriptor,
  ) {
    const originalMethod = descriptor.value;

    descriptor.value = async function (...args: any[]) {
      const [data] = args;
      const object = plainToInstance(dtoClass, data);
      const errors = await validate(object);

      if (errors.length > 0) {
        throw new RpcException({
          code: grpc.status.INVALID_ARGUMENT,
          message: 'Input data validation failed',
        });
      }

      return originalMethod.apply(this, args);
    };
  };
}

然后在你的 grpc 控制器中使用这个装饰器,如下所示:

@GrpcMethod('UserService', 'getUser')
@ValidateGrpcInput(GetUserRequestDto)
async getUser(data: GetUserRequestDto): Promise<UserEntity> {
  /* Your controller logic here */
}
© www.soinside.com 2019 - 2024. All rights reserved.