import { ArrayMaxSize, ArrayMinSize, IsArray, IsBoolean, IsString, ValidateNested } from "class-validator";
import { Transform, Type } from "class-transformer";
class CreateAnswerDto {
@IsBoolean()
readonly isTrue: string;
@IsString()
title: string;
@IsString()
description: string;
}
const transformAnswers = answers => {
return JSON.parse(answers.value);
};
export class CreateQuestionDto {
@Transform(transformAnswers, { toClassOnly: true })
@IsArray()
@ArrayMinSize(4)
@ArrayMaxSize(4)
@ValidateNested({ each: true })
@Type(() => CreateAnswerDto)
readonly answers: CreateAnswerDto[];
@IsString()
readonly title: string;
}
Run Code Online (Sandbox Code Playgroud)
所以我有相同的代码,并且我想验证答案中的每个对象字段,但此代码不起作用。如果我发送了错误的数据,则此验证会跳过它。我怎样才能正确验证我的答案?
谢谢你的帮助!
NestJS 控制器以及类验证器当前返回如下错误消息:
{
statusCode: 422,
message: [ 'Name is required', 'Email is required' ],
error: 'Unprocessable Entity'
}
Run Code Online (Sandbox Code Playgroud)
但我想将每条消息绑定到其相关属性,如下所示:
{
statusCode: 422,
message: { name: 'Name is required', email: 'Email is required' },
error: 'Unprocessable Entity'
}
Run Code Online (Sandbox Code Playgroud)
我的DTO:
import { IsNotEmpty } from 'class-validator';
export class CreateUserRequestDTO {
@IsNotEmpty({ message: 'Name is required' })
name: string;
@IsNotEmpty({ message: 'Email is required' })
email: string;
}
Run Code Online (Sandbox Code Playgroud)
我如何更改 NestJS 控制器/类验证器错误以返回这样的消息?
我正在尝试验证 get 请求的查询中出现的参数,但由于某种原因,验证管道无法识别查询的元素。
import {
Controller,
Post,
Query,
Body,
UseInterceptors,
Param,
Res,
Logger,
} from '@nestjs/common';
import { Crud, CrudController, Override } from '@nestjsx/crud';
import { OpenScheduleDto } from './open-schedule.dto';
@Crud(Schedule)
export class ScheduleController
implements CrudController<ScheduleService, Schedule> {
constructor(public service: ScheduleService) {}
get base(): CrudController<ScheduleService, Schedule> {
return this;
}
@Override()
async getMany(@Query() query: OpenScheduleDto) {
return query;
}
}
Run Code Online (Sandbox Code Playgroud)
OpenSchedule.dto
import { IsNumber, IsOptional, IsString } from 'class-validator';
export class OpenScheduleDto {
@IsNumber()
companyId: number;
@IsNumber()
@IsOptional()
professionalId: number; …
Run Code Online (Sandbox Code Playgroud) 我正在为我的项目使用 NestJs 框架。在我的控制器中,我接受 POST 请求,并通过 ValidationPipe 将 body 转换为我的 CreateHouseDTO。ValidationPipe 正在使用白名单和转换。
当我像这样使用 JSON 尝试 api 时:
{
"name": "Test",
"floors": [
{
"name": "floor1",
"rooms": [
{
"name": "room1"
},
{
"name": "room2"
}
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
这是我的应用程序记录的内容(console.log 输出):
CreateHouseDTO{
name:'Test',
floors[ {} ]
}
Run Code Online (Sandbox Code Playgroud)
当我在嵌套对象中犯一些错误时,它甚至会验证嵌套对象。例如,如果我将Floor对象中的name属性设置为Null或某个没有引号的数字。
这是一个错误还是我做错了什么?请帮我。
我的代码:
{
"name": "Test",
"floors": [
{
"name": "floor1",
"rooms": [
{
"name": "room1"
},
{
"name": "room2"
}
]
}
]
}
Run Code Online (Sandbox Code Playgroud) 我想验证坐标。这些将被存储为real
数据列,来自Postgres 文档
实数 4 字节可变精度,不精确的 6 位小数精度
我从以下开始
@IsNumber()
@Min(-90)
@Max(90)
/* precision check */
public latitude: number;
@IsNumber()
@Min(-180)
@Max(180)
/* precision check */
public longitude: number;
Run Code Online (Sandbox Code Playgroud)
并想知道如何检查这些浮点数的精度。它必须具有 6 位精度。
提前致谢
我目前正在使用 Nest.js 并有一个简单的应用程序,其中包含注册帐户的路径。我创建了一个包含几个字段和一个 mongodb 模式的 DTO。在 mongodb 模式中只有一个字段我不想让用户在创建时修改(=特权),所以我没有在 DTO 中指定它。
但是,如果用户使用正文中的权限属性发出请求,它仍将保存到 DTO,然后保存在架构中。
有没有办法“切断”身体中与 DTO 不匹配的任何数据?我敢肯定它曾经告诉我有一个它无法识别的领域,但它似乎不再起作用了。我试图找到一个类验证器或其他东西,但找不到任何合适的东西,我真的不想自己检查每个属性......
提前致谢!
来自 account.service.ts
async register(body: RegisterAccountDto) {
return new_account.save();
}
Run Code Online (Sandbox Code Playgroud)
来自 account.controller.ts
@ApiOperation({ summary: 'Register user', description: 'Register a new account' })
@ApiConsumes('x-www-form-urlencoded')
@ApiBody({ type: [RegisterAccountDto] })
@Post('register')
async register(@Body() body: RegisterAccountDto) {
return this.accountService.register(body);
}
Run Code Online (Sandbox Code Playgroud)
来自 account.schema.ts
@Prop({ default: Privilege.USER })
privilege: Privilege;
Run Code Online (Sandbox Code Playgroud) 在 NestJS 中给出两个 DTO 时class ADto
,class BDto
class ADto extends PartialType(BDto)
类型强制失败。(参数不会从字符串转换为数字,导致类验证器抛出错误)。
如果class ADto extends BDto
,一切正常。
为什么使用 PartialType 不包括类型强制?
我有一个 dto 文件:
export class UpdateUserDto {
@IsUUID()
public readonly uuid: string;
@IsObject()
@Type(() => UserModelDto)
public readonly dataToUpdate: UserModelDto;
}
Run Code Online (Sandbox Code Playgroud)
问题是,@Type() 装饰器似乎不起作用。我的 UserModelDto 看起来像这样:
export class UserModelDto {
@IsUUID()
@IsOptional()
public uuid?: string;
@IsEmail()
@IsOptional()
public email?: string;
@IsString()
@IsOptional()
public password?: string;
@IsJWT()
@IsOptional()
public refreshToken?: string;
}
Run Code Online (Sandbox Code Playgroud)
当我向控制器发送请求时,验证对字段不起作用,dataToUpdate
但对它uuid
有效。我尝试了很多方法但结果仍然相同。
可以注意到,当您使用 DTO 而不是管道(取决于具体情况)时,验证主体甚至路由/查询参数可以更简单、更安全且更具可读性。作为一个简单的示例,我喜欢使用 DTO 来验证 id 的想法,就像在 findOne() 路由中一样。所以,有了这样的课程
export class IdDto {
@IsInt()
@IsPositive()
id: number;
}
Run Code Online (Sandbox Code Playgroud)
我可以很好地验证(序列)id。并在路由处理程序中使用它,如下所示
findOne(@Param() { id }: IdDto)
Run Code Online (Sandbox Code Playgroud)
问题是当我有多个 id 作为路由参数时。显然我必须以不同的方式命名它们,然后我就不能再使用这个 DTO 了。除非我为像这样的每种情况创建一个特定的 DTO,只需重命名字段即可。在这种情况下,是否有任何方法可以维持此 DTO(或任何其他)的使用?或者真的没有其他选择吗?
当然,我可以建造自己的管道。只是 DTO 方法要简单得多,而且类验证器装饰器会自动显示验证失败的具体步骤。但也许这是除了多个类似的 DTO 之外的唯一选择。
预先致谢,并致以最诚挚的问候。
PS:在我提到的多个 id 的情况下,情况会稍微复杂一些。但如果我仍然只有一个 id,但想在路由中以不同的方式命名它?同样的问题也适用,以防它可能更简单。
我是 NestJ 的新手。我在 Body 中有一个传入字段,在 DTO 中验证它之前我需要对其进行 JSON.parse。
控制器
@Post('test')
@UsePipes(new ValidationPipe({transform: true}))
@UseInterceptors(
FileInterceptor('image', {
storage: diskStorage({
destination: './uploads/users',
filename: editFileName,
}),
fileFilter: imageFileFilter,
}),
)
testapi(
@UploadedFile() file,
// @Body('role', CustomUserPipe) role: string[],
@Body() data: CreateUserDto,
)
{
//
}
Run Code Online (Sandbox Code Playgroud)
数据传输组织
@Transform(role => {JSON.parse(role)}, {toPlainOnly: true})
@IsNotEmpty({message: "Role can't be empty"})
@IsArray({message: "Role must be in array"})
@IsEnum(UserRole, {each: true, message: "Enter valid role"})
role: UserRole[];
Run Code Online (Sandbox Code Playgroud) 我在验证嵌套对象时遇到困难。使用类验证器运行nestJs。顶级字段(名字、姓氏等)验证正常。Profile 对象在顶层验证正常,即如果我作为数组提交,我会得到正确的错误,它应该是一个对象。
然而,Profile 的内容尚未得到验证。我已遵循文档上的建议,但也许我只是错过了一些东西。
有谁知道如何验证嵌套对象字段?
export enum GenderType {
Male,
Female,
}
export class Profile {
@IsEnum(GenderType) gender: string;
}
export class CreateClientDto {
@Length(1) first_name: string;
@Length(1) last_name: string;
@IsEmail() email: string;
@IsObject()
@ValidateNested({each: true})
@Type(() => Profile)
profile: Profile;
}
Run Code Online (Sandbox Code Playgroud)
当我发送此有效负载时,我预计它会失败,因为性别不在枚举或字符串中。但它并没有失败
{
"first_name":"A",
"last_name":"B",
"profile":{
"gender":1
}
}
Run Code Online (Sandbox Code Playgroud) 我需要通过类验证器使用接口来验证传入请求正文中特定字段的传入表单。
界面:
export enum Fields {
Full_Stack_Dev = 'full stack dev',
Frontend_Dev = 'frontend dev',
Backend_Dev = 'backend dev',
}
export interface Experience {
field: Fields;
years: number;
}
Run Code Online (Sandbox Code Playgroud)
这是DTO
课程:
@IsEnum(Languages)
languages: Languages[];
experience: Experience[]; // Not sure which decorator to use for interfaces
Run Code Online (Sandbox Code Playgroud) 我想做的是当有人尝试使用已在使用的电子邮件进行注册时传播错误。默认情况下,这会返回 500 错误,但我需要它针对此特定场景抛出有意义的错误。注意:程序对于每个错误都会返回 500 错误
class-validator ×13
nestjs ×12
typescript ×9
node.js ×5
dto ×2
javascript ×2
validation ×2
backend ×1