gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 05:59:28 30 4
gpt4 key购买 nike

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

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

{
id: 'DESC'
}

我不想每次需要排序时都手动调用这个转换方法。

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

pipe 有效,但我仍然需要为每个端点定义添加 @Query(new SortPipe())

另一个选项是在存储库本身中。 NestJS 文档写得很好,但缺少关于在哪里放置内容的指导。

是否有人在 NestJS 中使用查询参数之前遇到类似的转换问题,并且可以解释在 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com