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();

我的问题是createdAftercreatedBeforesearchNotesDto 中的字符串,我希望使用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 包反序列化为具有自定义属性名称的类

如何将具有不同值的相同 JSON 对象反序列化为 java 类

无法将当前 JSON 数组(例如 [1,2,3])反序列化为具有复杂和嵌套对象的类型

如何将 JSON 反序列化为具有多个 List<T> 参数的 .NET 对象?