NestJS 将@Query() 反序列化为具有复杂类型的 DTO

NestJS deserializing @Query() to a DTO with complex types

在学习 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?

@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;
   }
}