在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;
  }
}

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

yujingjean 回答:在NestJS参数装饰器中禁用验证

制作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;
  }
}

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

本文链接:https://www.f2er.com/3143695.html

大家都在问