Class-Validator node.js предоставляет пользовательскую ошибку - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть пользовательское ограничение валидатора и аннотация, созданная для проверки, существует ли уже сущность с данным свойством, вот код

import { Inject, Injectable } from '@nestjs/common';
import { registerDecorator, ValidationArguments, ValidationOptions, ValidatorConstraint } from 'class-validator';
import { ValidatorConstraintInterface } from 'class-validator/types/validation/ValidatorConstraintInterface';
import { Connection } from 'typeorm';
import { InjectConnection } from '@nestjs/typeorm';

@ValidatorConstraint({ async: true })
@Injectable()
export class EntityExistsConstraint implements ValidatorConstraintInterface {

  constructor(@InjectConnection() private dbConnection: Connection) {
  }

  defaultMessage(validationArguments?: ValidationArguments): string {
    return `${validationArguments.constraints[0].name} with ${validationArguments.property} already exists`;
  }

  validate(value: any, validationArguments?: ValidationArguments): Promise<boolean> | boolean {
    const repoName = validationArguments.constraints[0];
    const property = validationArguments.property;
    const repository = this.dbConnection.getRepository(repoName);
    return repository.findOne({ [property]: value }).then(result => {
      return !result;
    });
  }

}

export function EntityExists(repoName, validationOptions?: ValidationOptions) {
  return function(object: any, propertyName: string) {
    registerDecorator({
      target: object.constructor,
      propertyName: propertyName,
      options: validationOptions,
      constraints: [repoName],
      validator: EntityExistsConstraint,
    });
  };
}

Все работает нормально, но я получаю этот ответ, когда проверка не проходит

{
    "statusCode": 400,
    "message": [
        "User with email already exists"
    ],
    "error": "Bad Request"
}

Я хочу, чтобы ошибка была исключением из-за конфликта => statusCode 409, как мне этого добиться?

1 Ответ

1 голос
/ 20 апреля 2020

class-validator ничего не делает с кодами http. Он только проверяет и возвращает список ошибок или пустой массив.

Что вам нужно сделать, это проверить используемую платформу, я предполагаю, что это гнездо js или контроллеры маршрутизации.

В случае с контроллерами маршрутизации вам нужно написать собственный после промежуточного ПО и отключить промежуточное ПО по умолчанию (оно преобразует ошибки проверки в 400 ошибочных запросов). Более подробная информация здесь: https://github.com/typestack/routing-controllers#error - обработчики

В случае с гнездом js - те же шаги. Более подробную информацию вы можете найти здесь: https://docs.nestjs.com/exception-filters#catch -все

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...