NestJS 将 @Query() 反序列化为具有复杂类型的 DTO
Posted
技术标签:
【中文标题】NestJS 将 @Query() 反序列化为具有复杂类型的 DTO【英文标题】:NestJS deserializing @Query() to a DTO with complex types 【发布时间】:2020-05-25 01:49:50 【问题描述】:在学习 NestJS 时遇到了一个问题,我有以下 DTO:
export default class SearchNotesDto
query: string;
createdAfter: Date;
createdBefore: Date;
当向端点发出GET
请求时,我希望得到它,它由我的控制器中的以下函数处理:
@Get()
getNotes(@Query() searchNotesDto: SearchNotesDto): Note[]
if (Object.keys(searchNotesDto).length)
return this.notesService.searchNotes(searchNotesDto);
return this.notesService.getAllNotes();
我的问题是createdAfter
和createdBefore
是searchNotesDto
中的字符串,我希望使用Date
对象,有没有办法将这些字段隐式转换为Date
?
【问题讨论】:
【参考方案1】:@Query
将序列化所有属性以键入string
,因为这就是查询字符串在 HTTP 请求方面的工作方式。您需要使用Pipe
将您的查询转换为正确的数据形状。
https://docs.nestjs.com/pipes
export class SearchNotePipe implements PipeTransform
transform(value: any, metadata: ArgumentMetadata)
// value will be your `searchNotesDto`
const notesDto = new SearchNotesDto();
// do your transformation here
return notesDto;
【讨论】:
我知道查询字符串是一个 string,我只是在寻找一种干净的方式来处理序列化,而管道就是这种方式 - 谢谢!以上是关于NestJS 将 @Query() 反序列化为具有复杂类型的 DTO的主要内容,如果未能解决你的问题,请参考以下文章
如何将具有嵌套属性的 JSON 对象反序列化为 Symfony 实体?
如何将具有不同值的相同 JSON 对象反序列化为 java 类