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

问题描述 投票:0回答:1

[我有一个使用通行证的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 nest
1个回答
0
投票

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

而且所讨论的公关甚至都没有按照我的想法去做,因此它也不起作用。

© www.soinside.com 2019 - 2024. All rights reserved.