我正在尝试对发送到使用 NestJS 构建的 gRPC 服务的请求进行参数验证,这就是我的示例方法的样子:
@GrpcMethod('Service', 'Method')
methodName(request: Request, _metadata: Metadata, call: ServerWritableStreamImpl<Request, Observable<Response>>) {
...
}
我们使用 proto 文件来定义请求和响应接口。
如何验证请求参数并返回/抛出异常,例如BAD_REQUEST 代码?
到目前为止我已经尝试过:
您可以创建自定义装饰器来使用
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 */
}