如何在控制器中覆盖全局 ValidationPipe?
Posted
技术标签:
【中文标题】如何在控制器中覆盖全局 ValidationPipe?【英文标题】:How to override global ValidationPipe in controller? 【发布时间】:2019-10-09 22:17:57 【问题描述】:我使用带有 transform: true, whitelist: true
选项的全局ValidationPipe
。但是,在特定的控制器请求中,我想重用相同的类但具有不同的验证,应用类验证器的验证组技术。因此,我有必要覆盖管道的选项以应用新选项。
这是在 NestJS 6.2.4 上。我尝试在@Query(new ValidationPipe(groups: ['res']))
处应用新管道,但仍应用全局管道。我对@UsePipes()
应用了相同的逻辑,但再次应用了全局管道。
另外,我尝试将 always: false
属性与组一起应用,以避免始终验证该属性,但由于这是默认行为,它并没有太大帮助。
@IsNumberString( groups: ['res'] )
resId: number;
【问题讨论】:
我为此苦苦挣扎,并没有得出一个满意的结论。我使用一个基类来创建所有验证器,然后将它的一个子类扩展为 PartialType,以便这些属性可以是可选的。我能够覆盖验证的唯一方法是执行 OmitType,然后使用新的验证重新声明该属性。 【参考方案1】:在这种情况下,我建议将ValidationPipe
添加到控制器内的方法级别,而不是控制器级别。
类似这样的:
@Controller('users')
export class UsersController
constructor(
private readonly usersService: UsersService
)
@Post()
@UsePipes(new ValidationPipe(
forbidUnknownValues: true,
transform: true
))
async create(@Body() createUserDtoReq: CreateUserRequestDto): Promise<UserResponseDto>
return await this.usersService.create(createUserDtoReq);
不过,其他人可能会添加其他建议。
【讨论】:
这也不起作用。还有其他解决办法吗? 我猜这里的评论不支持这个功能https://github.com/nestjs/nest/issues/2390#issuecomment-502042256
哦,原来如此,目前确实不支持
有什么解决方法吗?正如@SandeepKNair 提供的 github 问题链接上的 cmets 之一所述,我最终为每个控制器手动添加了验证管道。 :(以上是关于如何在控制器中覆盖全局 ValidationPipe?的主要内容,如果未能解决你的问题,请参考以下文章
如何覆盖全局样式(没有 x:Key),或者将命名样式应用于所有以类型为目标的控件?