ウェブサイト検索

TypeScript - NESTJS バリデーションパイプとサービス層を用いたカスタムバリデータデコレーター


こんにちは、私は最近NESTJSを始めたばかりで、この問題を解決するための助けが必要です。この問題は、バリデーションパイプでリクエストのトークンにアクセスし、別のAPI(同じトークンを使用)を呼び出し、HttpModuleを使って送信されたIDが有効かどうかを確認する必要があるということです。

バリデーションパイプ(nestjsドキュメントのサンプル):

@Injectable()
export class ValidationPipe implements PipeTransform<any> {
  async transform(value, { metatype }: ArgumentMetadata) {
    if (!metatype || !this.toValidate(metatype)) {
      return value;
    }
    const object = plainToClass(metatype, value);
    const errors = await validate(object);
    if (errors.length > 0) {
      throw new BadRequestException('Validation failed');
    }
    return value;
  }

  private toValidate(metatype): boolean {
    const types = [String, Boolean, Number, Array, Object];
    return !types.find((type) => metatype === type);
  }
}

カスタムバリデーター :

import { registerDecorator, ValidationOptions, ValidationArguments } from 'class-validator';

export function IsLanguageValid(property: string, validationOptions?: ValidationOptions) {
  return function(object: Object, propertyName: string) {
    registerDecorator({
      name: 'isLanguageValid',
      target: object.constructor,
      propertyName: propertyName,
      constraints: [property],
      options: validationOptions,
      validator: {
        validate(value: any, args: ValidationArguments) {
          const [relatedPropertyName] = args.constraints;
          const relatedValue = (args.object as any)[relatedPropertyName];

          // WHERE HOW CAN I ACCESS TO A SERVICE AND TOKEN OF THE REQUEST
          this.httpModule.get('url to other api', { headers: { authrorization : TOKEN }})
        },
      },
    });
  };
}

それの目的は何ですか。DTOにバリデーション用のデコレーターを設定すると、自動的にAPIが呼び出されて、language_idが存在するかどうかを確認します。

  @ApiModelProperty()
  @IsLanguageValid({}, { message: 'the language id sent is not valid'})
  @IsNumber({}, { message: 'the id should be a number' })
  language_id: number;