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();
}
我的问题是 createdAfter
和 createdBefore
是 searchNotesDto
中的字符串,我想使用 Date
对象,有没有办法隐式转换这些字段到 Date
?
@Query
会将所有属性序列化为 string
类型,因为这就是查询字符串在 HTTP 请求方面的工作方式。您将需要利用 Pipe
将您的查询转换为正确的数据形式。
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;
}
}
在学习 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
?
@Query
会将所有属性序列化为 string
类型,因为这就是查询字符串在 HTTP 请求方面的工作方式。您将需要利用 Pipe
将您的查询转换为正确的数据形式。
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;
}
}