NestJS 序列化 - 如何实例化默认值
NestJS Serialization - how to instantiate default values
我的一个 nestjs 服务中有以下 classes 和枚举
export enum Gender {
MALE = 'M',
FEMALE = 'F',
}
export class Address {
address1: string = '';
address2: string = '';
address3: string = '';
city: string = '';
state: string = 'TX';
country: string = 'USA';
}
export class Profile {
constructor(data?: any) {
if (data) {
Object.assign(this, data);
}
}
id: string;
firstName: string;
lastName: string;
email: string;
gender: Gender;
address?: Address = new Address();
}
当我使用如下所示的新运算符实例化 Profile 对象时,它正确地填充了
具有默认值的地址 字段(e.g.state 和国家/地区字段)
让配置文件:Profile = new Profile();
我有一个终点 - POST - /profiles
@Post('profiles')
@HttpCode(204)
@ApiResponse({
status: 204,
description: 'Audit Entry Created',
})
@ApiResponse({
status: 400,
description: 'Invalid Audit.',
})
@ApiResponse({
status: 401,
description: 'Unauthorized Access.',
})
@ApiResponse({
status: 500,
description: 'System Error.',
})
public async create(@Body() profile: Profile): Promise<void> {
await this.service.create(profile);
}
在请求正文中采用配置文件 JSON
{
'id':'123',
'firstName': 'John',
'lastName': 'Doe',
'email':'john.doe@johndoe.com',
'gender': 'M'
}
当我不传递请求正文的地址部分时,我期待
将使用默认值创建默认地址对象,因为我有配置文件 class 的那一部分。这没有发生。
有什么建议吗?
在不使用任何转换的情况下,传入的正文将只是请求的普通 JSON 表示。要使正文成为 Profile
class 的实例,您需要使用 ValidationPipe
或您自己的自定义管道,并实例化 Profile
class 使用传入正文。
否则,@Body()
只是映射到 express 或 fastify 的 req.body
,它不会为你做任何反序列化
这个问题在添加 @UsePipes(new ValidationPipe({ transform: true }))
后得到解决
@Post('profiles')
@UsePipes(new ValidationPipe({ transform: true }))
public async create(@Body() profile: Profile): Promise<void> {
await this.service.create(profile);
}
我的一个 nestjs 服务中有以下 classes 和枚举
export enum Gender {
MALE = 'M',
FEMALE = 'F',
}
export class Address {
address1: string = '';
address2: string = '';
address3: string = '';
city: string = '';
state: string = 'TX';
country: string = 'USA';
}
export class Profile {
constructor(data?: any) {
if (data) {
Object.assign(this, data);
}
}
id: string;
firstName: string;
lastName: string;
email: string;
gender: Gender;
address?: Address = new Address();
}
当我使用如下所示的新运算符实例化 Profile 对象时,它正确地填充了 具有默认值的地址 字段(e.g.state 和国家/地区字段)
让配置文件:Profile = new Profile();
我有一个终点 - POST - /profiles
@Post('profiles')
@HttpCode(204)
@ApiResponse({
status: 204,
description: 'Audit Entry Created',
})
@ApiResponse({
status: 400,
description: 'Invalid Audit.',
})
@ApiResponse({
status: 401,
description: 'Unauthorized Access.',
})
@ApiResponse({
status: 500,
description: 'System Error.',
})
public async create(@Body() profile: Profile): Promise<void> {
await this.service.create(profile);
}
在请求正文中采用配置文件 JSON
{
'id':'123',
'firstName': 'John',
'lastName': 'Doe',
'email':'john.doe@johndoe.com',
'gender': 'M'
}
当我不传递请求正文的地址部分时,我期待
将使用默认值创建默认地址对象,因为我有配置文件 class 的那一部分。这没有发生。
有什么建议吗?
在不使用任何转换的情况下,传入的正文将只是请求的普通 JSON 表示。要使正文成为 Profile
class 的实例,您需要使用 ValidationPipe
或您自己的自定义管道,并实例化 Profile
class 使用传入正文。
否则,@Body()
只是映射到 express 或 fastify 的 req.body
,它不会为你做任何反序列化
这个问题在添加 @UsePipes(new ValidationPipe({ transform: true }))
后得到解决 @Post('profiles')
@UsePipes(new ValidationPipe({ transform: true }))
public async create(@Body() profile: Profile): Promise<void> {
await this.service.create(profile);
}