Отключить проверку в декораторе параметров nestjs - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть приложение NestJS, которое использует паспорт, и я хотел бы добавить @User параметр-декоратор для упрощения получения пользователем запроса, аналогично в этом примере .

Однако у меня также есть канал глобальной проверки, который я применяю для всех входящих запросов (тела, заголовки, строка запроса) и применяю другую проверку в зависимости от объявленного типа тела / запроса / заголовка. По какой-то причине при использовании функции 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 голосов
/ 08 ноября 2019

После создания PR с изменением, которое должно было исправить это , похоже, для моей конкретной проблемы я мог бы использовать 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, о котором идет речь, даже не делает то, о чем я думал, поэтому он тоже не работает.

...