在NestJS中定义时自动将查询参数解析为对象

在NestJS中定义时自动将查询参数解析为对象,nestjs,Nestjs,我正在编写一个NestJS应用程序。一些端点支持排序,例如http://127.0.0.1:3000/api/v1/members?sort=-id&take=100这意味着按id降序排序 此参数作为@Query参数到达,并传递给我的服务。此服务将其转换为TypeORM使用的对象: { id: 'DESC' } 我不想每次需要排序时都手动调用此转换方法 我尝试了一个拦截器,但这个拦截器无法轻松地将请求参数更改为所需的对象 一个管道工作了,但是我仍然需要为每个端点定义添加@Query(new

我正在编写一个NestJS应用程序。一些端点支持排序,例如
http://127.0.0.1:3000/api/v1/members?sort=-id&take=100
这意味着按
id
降序排序

此参数作为
@Query
参数到达,并传递给我的服务。此服务将其转换为TypeORM使用的对象:

{
  id: 'DESC'
}
我不想每次需要排序时都手动调用此转换方法

我尝试了一个
拦截器
,但这个拦截器无法轻松地将请求参数更改为所需的对象

一个
管道
工作了,但是我仍然需要为每个端点定义添加
@Query(new SortPipe())

另一个选项是存储库本身。NestJS文档编写得非常好,但缺少了在何处放置内容的指导

是否有人在将查询参数转换为NestJS之前遇到过类似的问题,并且可以解释在NestJS中什么方法是最好的


这个问题可能看起来像是一个基于观点的问题,但是我正在寻找在考虑NestJS理念的情况下应该采用的方法。

管道可能是实现这一点的最简单方法。您可以添加将在每个端点上调用的全局管道,而不是为每个端点定义添加管道。在您的
main.ts
中:

异步函数引导(){
...
app.useGlobalPipes(新的SortPipe());
...
}
然后可以创建如下所示的管道:

从'@nestjs/common'导入{PipeTransform,可注入,ArgumentMetadata};
@可注射()
导出类SortPipe实现PipeTransform{
转换(值:任意,元数据:ArgumentMetadata){
const{type}=元数据;
//确保只对查询运行逻辑
如果(type=='query')返回此.transformQuery(值);
返回值;
}
transformQuery(查询:任意){
if(typeof query!=“object”| |!value)返回查询;
const{sort}=query;
if(sort)query.sort=convertfortypeform(sort);
返回查询;
}
}
如果不希望自动转换所有端点上的排序值,可以将自定义参数传递给
@Query()
,例如
@Query('sort')
。然后:

转换(值:任意,元数据:ArgumentMetadata){
const{type,data}=元数据;
//确保仅在提供“sort”时对查询运行逻辑
if(type=='query'&&data=='sort')返回此.transformQuery(值);
返回值;
}