我正在尝试使嵌套验证器按“管道”文档(https://docs.nestjs.com/pipes)部分“对象模式验证”中的示例工作。我正在尝试使用Joi的示例,除了将模式从控制器传递到验证服务之外,该示例均有效。
import * as Joi from 'joi';
import { PipeTransform, Injectable, ArgumentMetadata, BadRequestException
} from '@nestjs/common';
@Injectable()
export class JoiValidationPipe implements PipeTransform {
constructor(private readonly schema) {}
transform(value: any, metadata: ArgumentMetadata) {
const { error } = Joi.validate(value, this.schema);
if (error) {
throw new BadRequestException('Validation failed');
}
return value;
}
}
编译器抱怨:
嵌套无法解析JoiValidationPipe(?)的依赖项。请 确保索引[0]处的参数在当前 上下文。
在控制器中
@Post()
@UsePipes(new JoiValidationPipe(createCatSchema))
async create(@Body() createCatDto: CreateCatDto) {
this.catsService.create(createCatDto);
}
在给定预期值为零的情况下,编译器抱怨一个参数。
这似乎是一个声明问题,但我真的不知道。为什么这不起作用,如何将架构传递给服务?
答案 0 :(得分:1)
正如您所说,JoiValidationPipe
必须不在任何模块中都声明为提供程序。
我只能用以下代码重现错误(不传递模式):
@UsePipes(JoiValidationPipe)
async create(@Body() createCatDto: CreateCatDto) {
this.catsService.create(createCatDto);
}
请确保您的代码中没有此位置。
这对我有用:
@UsePipes(new JoiValidationPipe(Joi.object().keys({ username: Joi.string().min(3) })))
async create(@Body() createCatDto: CreateCatDto) {
this.catsService.create(createCatDto);
}