Class-Validator node.js提供自定义的错误信息

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Class-Validator node.js提供自定义的错误信息相关的知识,希望对你有一定的参考价值。

我有一个自定义的验证器约束和注解,用于检查给定属性的实体是否已经存在,以下是代码。

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"
}

我希望错误是Conflict Exception=>statusCode 409,如何实现?

答案

class-validator不对http代码做任何事情。它只是验证并返回一个错误列表或一个空数组。

你需要做的是检查你所使用的框架,我假设是nestjs或者路由控制器。

如果是路由控制器,你需要写自己的中间件,并禁用默认的中间件(它将验证错误转换为400个坏的请求).更多信息在这里。https:/github.comtypestackrouting-controllers#errorhandlers。

在nestjs的情况下--同样的步骤。更多信息你可以在这里找到。https:/docs.nestjs.comexception-filters#catch-everything。

以上是关于Class-Validator node.js提供自定义的错误信息的主要内容,如果未能解决你的问题,请参考以下文章

Class-validator - 验证对象数组

是否可以将 `class-validator` 与 antd `Form.useForm`() 一起使用?

在 NestJS 中抛出与 `class-validator` 相同的错误格式

NestJS DTO 类设置 class-validator 和 class-transformer 执行顺序

使用 class-validator 和 Nest.js 验证对象数组

如何使用 NestJS 和 class-validator 手动测试输入验证