在NestJS参数装饰器中禁用验证

时间:2019-11-07 15:13:27

标签: decorator nestjs

我有一个使用通行证的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;
  }
}

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

1 个答案:

答案 0 :(得分:0)

制作a PR with a change that was supposed to fix this后,对于我的特定问题,我可以使用meta.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;
  }
}

有问题的公关甚至没有按照我的想法去做,所以它也不起作用。