我正在编写一个NestJS应用程序。一些端点支持排序,例如http://127.0.0.1:3000/api/v1/members?sort=-id&take=100
表示按id
降序排序。
此参数作为@Query
参数到达,并传递给我的服务。该服务将其转换为TypeORM使用的对象:
{
id: 'DESC'
}
我不想每次需要排序时都手动调用此转换方法。
我已经尝试过
intercepter
,但是这不能轻易地将请求参数更改为所需的对象。pipe
工作正常,但是我仍然需要为每个端点定义添加@Query(new SortPipe())
。另一个选择是在存储库本身中。 NestJS文档写得很好,但是缺少放置内容的指导。
在NestJS中使用Query参数之前,是否有人在转换查询参数时遇到类似的问题,并且可以解释在NestJS中哪种方法是最好的?
这个问题可能看起来像是一个基于意见的问题,但是我正在寻找应该以NestJS哲学为基础的方式。
最佳答案
管道可能是实现此目的的最简单方法。无需为每个端点定义添加管道,而是可以添加将在每个端点上调用的全局管道。在您的main.ts
中:
async function bootstrap() {
...
app.useGlobalPipes(new SortPipe());
...
}
然后,您可以像这样创建管道:
import { PipeTransform, Injectable, ArgumentMetadata } from '@nestjs/common';
@Injectable()
export class SortPipe implements PipeTransform {
transform(value: any, metadata: ArgumentMetadata) {
const { type } = metadata;
// Make sure to only run your logic on queries
if (type === 'query') return this.transformQuery(value);
return value;
}
transformQuery(query: any) {
if (typeof query !== 'object' || !value) return query;
const { sort } = query;
if (sort) query.sort = convertForTypeOrm(sort);
return query;
}
}
如果您不想自动转换所有端点上的排序值,则可以将自定义参数传递给
@Query()
,例如@Query('sort')
。然后: transform(value: any, metadata: ArgumentMetadata) {
const { type, data } = metadata;
// Make sure to only run your logic on queries when 'sort' is supplied
if (type === 'query' && data === 'sort') return this.transformQuery(value);
return value;
}
关于nestjs - 在NestJS中定义时,自动将查询参数解析为对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52301216/