gpt4 book ai didi

javascript - NestJs:如何使 Body 输入形状与实体的 DTO 不同?

转载 作者:行者123 更新时间:2023-12-03 07:18:32 45 4
gpt4 key购买 nike

我的照片和标签对象的 DTO 如下所示:

export class PhotoDto {
readonly title: string
readonly file: string
readonly tags: TagDto[]
}

export class TagDto {
readonly name: string
}
我使用 PhotoDto在我的 photo.service.ts并最终在 photo.controller.ts用于创建照片:
// In photo.service.ts
async create(createPhotoDto: PhotoDto): Promise<PhotoEntity> {
// ...
return await this.photoRepo.create(createPhotoDto)
}

// In photo.controller.ts
@Post()
async create(@Body() createPhotoDto: PhotoDto): Promise<PhotoEntity> {
// ...
}
但是,API 的 Body 中的输入应具有以下结构:
{
"title": "Photo Title",
"file": "/some/path/file.jpg",
"tags": [
{
"name": "holiday"
},
{
"name": "memories"
}
]
}
如何更改 Body 的输入形状接受这种结构?
{
"title": "Photo Title",
"file": "/some/path/file.jpg",
"tags": ["holiday", "memories"]
}
我尝试创建 2 个不同的 DTO,一个 CreatePhotoDtoInputPhotoDto ,一个用于 Controller 中所需的输入形状,另一个用于服务和实体,但这最终会变得非常困惑,因为在 2 个 DTO 之间进行转换需要做很多工作。
Body 具有不同输入形状的正确方法是什么?的 Post请求,然后将其变成实体使用所需的 DTO?

最佳答案

您可以使用 ValidationPipe() 的自动转换:

1) 添加ValidationPipe到您的 Controller :

@UsePipes(new ValidationPipe({ transform: true }))
@Post()
async create(@Body() createPhotoDto: PhotoDto): Promise<PhotoEntity> {
// ...
}

2) 添加 @Transform给您的 PhotoDto :
// Transforms string[] to TagDto[]
const transformTags = tags => {
if (Array.isArray(tags)) {
return tags.map(tag => ({name: tag}))
} else {
return tags;
}
}


import { Transform } from 'class-transformer';
export class PhotoDto {
readonly title: string
readonly file: string
@Transform(transformTags, {toClassOnly: true})
readonly tags: TagDto[]
}

关于javascript - NestJs:如何使 Body 输入形状与实体的 DTO 不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55448050/

45 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com