NestJs一个具有关系的Post请求
在我的NestJs应用程序中,我有两个实体:NestJs一个具有关系的Post请求,nestjs,Nestjs,在我的NestJs应用程序中,我有两个实体:person.entity.ts和property.entity.ts,这两个实体通过一对一的关系连接。我已经为个人和财产创建了DTO 关系的拥有方是这样定义的: @JoinColumn() @OneToMany( (type) => PersonProperties, (personProperties) => personProperties.person, { cascade: ['insert', '
person.entity.ts
和property.entity.ts
,这两个实体通过一对一的关系连接。我已经为个人和财产创建了DTO
关系的拥有方是这样定义的:
@JoinColumn()
@OneToMany(
(type) => PersonProperties,
(personProperties) => personProperties.person,
{ cascade: ['insert', 'update'] },
)
personProperties: PersonProperties[];
@Post()
async create(@Body() createPersonDto: CreatePersonDto) {
return this.personService.create(createPersonDto);
}
我的用于发布新人的控制器如下所示:
@JoinColumn()
@OneToMany(
(type) => PersonProperties,
(personProperties) => personProperties.person,
{ cascade: ['insert', 'update'] },
)
personProperties: PersonProperties[];
@Post()
async create(@Body() createPersonDto: CreatePersonDto) {
return this.personService.create(createPersonDto);
}
对于验证,我使用全局验证管道,如下所示:
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalPipes(
new ValidationPipe({
whitelist: true,
forbidNonWhitelisted: true,
transform: true,
transformOptions: {
enableImplicitConversion: true,
},
}),
);
我应该如何修改我的代码,以便通过一个请求发布(和验证)一个人的属性?这不是将一个DTO包含在另一个DTO中吗?您必须使用的是管道 在您的情况下,需要一个验证管道来根据DTO验证传入的请求 管道在控制器内部使用,不过您可以阅读有关创建自定义管道的内容。内置
ValidationPipe
现在可以满足您的需要。方法1
@Post()
async create(@Body(ValidationPipe) createPersonDto: CreatePersonDto) {
return this.personService.create(createPersonDto);
}
方法2
@Post()
@UsePipes(ValidationPipe)
async create(@Body() createPersonDto: CreatePersonDto) {
return this.personService.create(createPersonDto);
}
这两种方法基本上做相同的事情。它接受您的Body请求对象,并根据定义的DTO对其进行验证
希望这能回答您的问题。您必须使用的是管道 在您的情况下,需要一个验证管道来根据DTO验证传入的请求 管道在控制器内部使用,不过您可以阅读有关创建自定义管道的内容。内置
ValidationPipe
现在可以满足您的需要。方法1
@Post()
async create(@Body(ValidationPipe) createPersonDto: CreatePersonDto) {
return this.personService.create(createPersonDto);
}
方法2
@Post()
@UsePipes(ValidationPipe)
async create(@Body() createPersonDto: CreatePersonDto) {
return this.personService.create(createPersonDto);
}
这两种方法基本上做相同的事情。它接受您的Body请求对象,并根据定义的DTO对其进行验证
希望这能回答您的问题。解决方案是创建一个复合DTO对象,如下所示:
export class CreatePersonWithPropertiesDto {
@ValidateNested()
@Type(() => CreatePersonDto)
neuron: CreatePersonDto;
@IsOptional()
@ValidateNested({ each: true })
@Type(() => CreatePersonPropertiesDto)
personProperties?: CreatePersonPropertiesDto[];
}
然后调整控制器以期望复合DTO:
@Post()
async create(@Body() createPersonWithPropertiesDto: CreatePersonWithPropertiesDto) {
return this.personService.create(createPersonWithPropertiesDto);
}
解决方案是创建一个复合DTO对象,如下所示:
export class CreatePersonWithPropertiesDto {
@ValidateNested()
@Type(() => CreatePersonDto)
neuron: CreatePersonDto;
@IsOptional()
@ValidateNested({ each: true })
@Type(() => CreatePersonPropertiesDto)
personProperties?: CreatePersonPropertiesDto[];
}
然后调整控制器以期望复合DTO:
@Post()
async create(@Body() createPersonWithPropertiesDto: CreatePersonWithPropertiesDto) {
return this.personService.create(createPersonWithPropertiesDto);
}
感谢您的回答,但实际上它并没有回答我的问题,请注意,我确实使用ValidationPipe作为全局管道。我在这里感到困惑的是,我基本上有两个DTO发布在一起,一个用于个人,另一个用于财产。您能否显示一些代码或更具体地说明您试图实现的目标。我不认为我完全理解您想要做什么。如果我没有错,您打算做的是根据
个人属性
DTO验证personProperties??是吗?这是正确的,它与POST/person REST请求一起发布。我想这是一个很常见的要求。您是否尝试过使用单独的验证管道??````@Body('personProperties',ValidationPipe)personProperties,@Body()…)首先检查您的Body中是否有personProperties,并将其与personProperties数据库进行匹配以获得答案,但实际上它并没有回答我的问题,请注意,我确实使用ValidationPipe作为全局管道。我在这里感到困惑的是,我基本上有两个DTO发布在一起,一个用于个人,另一个用于财产。您能否显示一些代码或更具体地说明您试图实现的目标。我不认为我完全理解您想要做什么。如果我没有错,您打算做的是根据个人属性
DTO验证personProperties??是吗?这是正确的,它与POST/person REST请求一起发布。我想这是一个很常见的要求。您是否尝试过使用单独的验证管道??````@Body('personProperties',ValidationPipe)personProperties,@Body()..)首先检查您的Body中的personProperties,并将其与您的personProperties Dto进行匹配