类转换器文档说:
隐式类型转换
注意如果您将类验证器与类转换器一起使用,您可能不想启用此功能。
为什么不?
我做了一些测试,没有发现任何问题。
实际上,情况恰恰相反:将class-transformer(带有和enableImplicitConversion=trueReflect -metadata)与class-validator结合使用似乎是一个完美的选择,并且NestJS开箱即用地支持它
我想使用 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) 我正在使用类验证器来验证数据,我需要实现文件上传的验证。例如:文件不为空(如果还实现文件必须是图像,那就太好了)。
我尝试通过以下方式:
export class FileModel extends Model {
@IsNotEmpty()
file: File
constructor(body: any) {
super();
const {
file,
} = body;
this.file = file;
}
}
Run Code Online (Sandbox Code Playgroud)
但即使我选择文件,它总是返回“文件不应为空”。有没有办法实现文件上传的验证。
提前致谢 :)
如何使用类验证器检查数组是否为空。
下面给出的是我的结构。我想检查cartId是否为空。
{
"cartId": []
}
Run Code Online (Sandbox Code Playgroud) @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
目前,我有一个非常简单的类验证器文件,其中包含 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”中,用户传递了一个“电子邮件”字段。我想通过类验证器构建自定义验证规则,以便:
虽然检查电子邮件地址是否已在使用中是一项非常简单的任务,但如何将 DTO 中其他属性的值传递给自定义装饰器@IsEmailUsed
我正在尝试使用 验证数值的位数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。
谁能帮我?
我正在尝试验证 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,其中一名成员依赖于另一名成员。
需要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) 正如文档中提到的
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 选项的用途是什么?
class-validator ×10
nestjs ×6
node.js ×4
typescript ×4
dto ×2
arrays ×1
decorator ×1
javascript ×1
mongodb ×1
typeorm ×1
validation ×1