【问题标题】:Disable validation in nestjs param decorator在 nestjs 参数装饰器中禁用验证
【发布时间】:2020-03-04 05:04:57
【问题描述】:

我有一个使用护照的 NestJS 应用程序,我想添加一个 @User 参数装饰器以更轻松地让用户进入请求,类似于 this example。

但是,我还有一个全局验证管道,我将其应用于所有传入请求(正文、标头、查询字符串),并根据声明的正文/查询/标头类型应用不同的验证。出于某种原因,当使用 createParamDecorator() 函数时,NestJS 将验证器应用于 req.user 对象。然而那是错误的。护照用户不是请求内容的一部分,因此不应这样验证。

没有复制和粘贴createParamDecorator() 的源代码,并去掉了应用管道的行,有没有办法关闭管道,或者至少让我的验证管道忽略与请求无关的类型?

我的验证管道,供参考:

import { ArgumentMetadata, BadRequestException, Injectable, PipeTransform } from '@nestjs/common';

import { ValidationService } from './validation.service';

@Injectable()
export class ValidationPipe<T extends unknown> implements PipeTransform {
  public constructor(private readonly service: ValidationService) {}

  public async transform(value: T, metadata: ArgumentMetadata): Promise<T> {
    const className: string | undefined = metadata.metatype && metadata.metatype.name;
    if (className) {
      const errors = await this.service.validate(value, className);
      if (errors && errors.length > 0) {
        throw new BadRequestException(errors);
      }
    }

    return value;
  }
}

我不想要的一件事是将上述(或服务)修改为黑名单/白名单类型,因为这些类型会随着应用程序的发展而迅速变化,因此将它们添加到此类中将是一个很大的痛点列表。

【问题讨论】:

    标签: decorator nestjs


    【解决方案1】:

    在制作a PR with a change that was supposed to fix this 之后,似乎针对我的特殊问题,我可以使用 metadata.type,如下所示:

    import { ArgumentMetadata, BadRequestException, Injectable, PipeTransform } from '@nestjs/common';
    
    import { ValidationService } from './validation.service';
    
    @Injectable()
    export class ValidationPipe<T extends unknown> implements PipeTransform {
      public constructor(private readonly service: ValidationService) {}
    
      public async transform(value: T, metadata: ArgumentMetadata): Promise<T> {
        if (metadata.type !== 'custom') {
          const className: string | undefined = metadata.metatype && metadata.metatype.name;
          if (className) {
            const errors = await this.service.validate(value, className);
            if (errors && errors.length > 0) {
              throw new BadRequestException(errors);
            }
          }
        }
    
        return value;
      }
    }
    

    而有问题的 PR 甚至没有像我想象的那样做,所以它也没有真正起作用。

    【讨论】:

    猜你喜欢
    • 2021-11-25
    • 2019-08-29
    • 2021-12-30
    • 2021-05-17
    • 2021-12-10
    • 2021-05-19
    • 1970-01-01
    • 2022-01-03
    • 2018-07-27
    相关资源
    最近更新 更多