标签: class-validator

为什么我们在使用类转换器时不应该使用enableImplicitConversion?

类转换器文档说:

隐式类型转换
注意如果您将类验证器与类转换器一起使用,您可能不想启用此功能。

为什么不?

我做了一些测试,没有发现任何问题。
实际上,情况恰恰相反:将class-transformer(带有和enableImplicitConversion=trueReflect -metadata)与class-validator结合使用似乎是一个完美的选择,并且NestJS开箱即用地支持它

class-validator class-transformer

7
推荐指数
1
解决办法
6297
查看次数

ParseObjectIdPipe 获取 MongoDB 的 ObjectID

我想使用 TypeORM 和 MongoDB 创建一个 NestJs API。我的实体 id 字段的类型为ObjectID。控制器路由应在将传入的 id 传递给服务之前验证它们。我知道 Nest 附带了 ParseIntPipe 和 ParseUUIDPipe,但据我所知,没有任何东西可以用于 MongoDB ObjectID

因此,我为这些字段创建了自己的管道,如下所述https://docs.nestjs.com/pipes#transformation-use-case

import { PipeTransform, Injectable, BadRequestException } from '@nestjs/common';
import { ObjectID } from 'typeorm';

@Injectable()
export class ParseObjectIdPipe implements PipeTransform<any, ObjectID> {
  transform(value: any): ObjectID {
    const validObjectId: boolean = ObjectID.isValid(value);

    if (validObjectId) {
      throw new BadRequestException('Invalid ObjectId');
    }

    const objectId: ObjectID = ObjectID.createFromHexString(value);
    return objectId;
  }
}
Run Code Online (Sandbox Code Playgroud)

并希望这能够解决问题,即使对于边缘情况也是如此。我可以将它用于我的路线参数,例如

  @Get(':id')
  public getUserById(@Param('id', ParseObjectIdPipe) id: ObjectID): Promise<User> { …
Run Code Online (Sandbox Code Playgroud)

mongodb typeorm class-validator nestjs

7
推荐指数
3
解决办法
1万
查看次数

有没有办法使用类验证器实现文件上传的验证?

我正在使用类验证器来验证数据,我需要实现文件上传的验证。例如:文件不为空(如果还实现文件必须是图像,那就太好了)。

我尝试通过以下方式:

export class FileModel extends Model {
    @IsNotEmpty()
    file: File

    constructor(body: any) {
        super();
        const {
            file,
        } = body;

        this.file = file;
    }
}
Run Code Online (Sandbox Code Playgroud)

但即使我选择文件,它总是返回“文件不应为空”。有没有办法实现文件上传的验证。

提前致谢 :)

validation node.js typescript class-validator

7
推荐指数
1
解决办法
8939
查看次数

Node Js:使用类验证器验证空数组

如何使用类验证器检查数组是否为空。
下面给出的是我的结构。我想检查cartId是否为空。

{
   "cartId": []
}
Run Code Online (Sandbox Code Playgroud)

arrays node.js class-validator

7
推荐指数
1
解决办法
1万
查看次数

即使日期更大,嵌套类验证器 minDate 也会引发错误

@isDateString()我将 Nest 与类验证器一起使用,并尝试使用和验证 UI 提供的日期不早于今天@MinDate()

export class SchemaDto {
    @IsOptional()
    @IsDateString()
    @MinDate(new Date())
    myDate?: Date;
}
Run Code Online (Sandbox Code Playgroud)

我发送的数据是反对日期,日期如下:

    Mon Oct 04 2021 00:00:00 GMT-0400 (Eastern Daylight Time)
Run Code Online (Sandbox Code Playgroud)

我从类验证器得到的错误是:

     minimal allowed date for myDate is Fri Oct 01 2021 15:57:18 GMT-0400 (Eastern Daylight Time) 
Run Code Online (Sandbox Code Playgroud)

问题:

如果我删除 minDate 装饰器,一切正常,但我宁愿验证这个常见情况。

信息:打字稿:~4.1.4

节点:12.4.0

类验证器:0.13.1

巢:7.0.0

class-validator nestjs

7
推荐指数
1
解决办法
1万
查看次数

类验证器 (Node.js) 在自定义验证中获取另一个属性值

目前,我有一个非常简单的类验证器文件,其中包含 Nest.js 中的 ValidationPipe,如下所示:

import {
  IsDateString,
  IsEmail,
  IsOptional,
  IsString,
  Length,
  Max,
} from 'class-validator';

export class UpdateUserDto {
  @IsString()
  id: string;

  @Length(2, 50)
  @IsString()
  firstName: string;

  @IsOptional()
  @Length(2, 50)
  @IsString()
  middleName?: string;

  @Length(2, 50)
  @IsString()
  lastName: string;

  @IsEmail()
  @Max(255)
  email: string;

  @Length(8, 50)
  password: string;

  @IsDateString()
  dateOfBirth: string | Date;
}
Run Code Online (Sandbox Code Playgroud)

假设在上面的“UpdateUserDto”中,用户传递了一个“电子邮件”字段。我想通过类验证器构建自定义验证规则,以便:

  • 检查电子邮件地址是否已被用户从数据库中获取
  • 如果电子邮件地址已被使用,请检查当前用户(使用 'id' 属性的值)是否正在使用它,如果是,则验证通过,否则,如果它已被其他用户使用,则验证失败。

虽然检查电子邮件地址是否已在使用中是一项非常简单的任务,但如何将 DTO 中其他属性的值传递给自定义装饰器@IsEmailUsed

node.js class-validator nestjs

7
推荐指数
1
解决办法
2万
查看次数

类验证器:验证数值的位数

我正在尝试使用 验证数值的位数class-validator。例如:我的实体只能接受给定属性的 6 位数字。这边走

const user1 = new User();
user1.code = 123456 // should be valid

const user2 = new User();
user2.code = 12345 // should be invalid

const user3 = new User();
user2.code = 1234567 // should be invalid
Run Code Online (Sandbox Code Playgroud)

我尝试过使用 IsNumber、MinLength 和 MaxLength 的组合;但没有起作用。

class User {
    @IsPositive()
    @IsNotEmpty()
    @IsNumber({ maxDecimalPlaces: 0 })
    @MinLength(6)
    @MaxLength(6)
    public code: number;
}  
Run Code Online (Sandbox Code Playgroud)

我收到一条消息说code must be shorter than or equal to 6 characters

谁能帮我?

javascript typescript class-validator

7
推荐指数
1
解决办法
1万
查看次数

在 nestjs 中具有嵌套对象数组的类验证器

我正在尝试验证 nestjs 中的嵌套对象数组,它工作正常。但是,如果我发送非数组值(如字符串或空值),则会出现错误:

TypeError: Cannot read property 'length' of undefined.

嵌套字段:

@IsArray()
@ValidateNested({ each: true })
@Type(() => NestedDTO)
nested: NestedDTO[];
Run Code Online (Sandbox Code Playgroud)

如何在验证嵌套对象之前验证该值是一个数组?

版本:

NestJS: 6.10.14
class-validator: 0.11.0
Run Code Online (Sandbox Code Playgroud)

dto typescript class-validator nestjs

6
推荐指数
1
解决办法
1591
查看次数

类验证器:使用类成员作为装饰器参数

我有一个注册 DTO,其中一名成员依赖于另一名成员。

需要IsPostalCode知道zip国家/地区代码/区域设置,它是其他类成员之一。

是否可以使用类成员作为装饰器参数?

import {
  IsEmail,
  IsISO31661Alpha2,
  IsPostalCode,
  IsString
} from "class-validator"

export class SignupDto {
  @IsEmail()
  email: string

  @IsString()
  password: string

  @IsISO31661Alpha2()
  countryCode: string

  // Something like this
  @IsPostalCode(this.countryCode)
  zip: string
}
Run Code Online (Sandbox Code Playgroud)

decorator node.js typescript class-validator nestjs

6
推荐指数
2
解决办法
1万
查看次数

Nestjs ValidationPipe({transform: true}) 不会将请求正文的字符串转换为数字

正如文档中提到的

ValidationPipe 可以自动将有效负载转换为根据其 DTO 类键入的对象。要启用自动转换,请将转换设置为 true。

但我总是收到错误请求,因此转换不起作用。

邮递员请求体

验证DTO

export class CreateDistrictDto {
    @IsString()
    @IsNotEmpty()
    name: string;
    
    
    // associations
    @IsNotEmpty()
    @IsNumber()
    cityId: number;
}
Run Code Online (Sandbox Code Playgroud)

控制器中的路线

    @Post()
    async createCity(@Body() cityDto: CreateCityDto) {
        return await this.cityService.createCity(cityDto);
    }
Run Code Online (Sandbox Code Playgroud)

main.ts(我使用默认的@nestjs/common ValidationPipe)

app.useGlobalPipes(new ValidationPipe({
    transform: true,
}));
Run Code Online (Sandbox Code Playgroud)

这个答案说转换不适用于基元,这似乎是正确的。

/sf/answers/4702707831/ https://github.com/nestjs/nest/blob/master/packages/common/pipes/validation.pipe.ts#L137

那么为什么文档另有说法,transform: true 选项的用途是什么?

dto class-validator nestjs class-transformer

6
推荐指数
2
解决办法
8078
查看次数