如何在控制器中覆盖全局 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?的主要内容,如果未能解决你的问题,请参考以下文章

在 Emacs 中全局覆盖键绑定

如何在 asp.net c# 渲染覆盖中设置全局变量?

如何覆盖全局样式(没有 x:Key),或者将命名样式应用于所有以类型为目标的控件?

Jmeter函数作用域实时取值覆盖[针对HTTP Request等控制器]

替换全局热键

检查是不是在 JavaScript 中覆盖了全局属性/函数