nestjs - 在 NestJS 中定义时自动将查询参数解析为对象
问题描述
我正在编写一个 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 之前遇到类似的问题,并且可以解释在 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;
}
推荐阅读
- python - 文件读取嵌套循环不会循环多次
- rest - 使用 Restbird 对使用授权代码授予类型 Oauth 2.0 保护的 API 进行自动化测试
- python - Python:如何使 Pillow 和 Tkinter 兼容?
- python - 如何从 anacoda 中删除 python 模块
- python - 类在 SQLalchemy 中没有名为“x”的映射列
- actions-on-google - 在 Google Home Mini 上测试 Google Action
- weather - 返回不同语言的雅虎天气数据
- html - 如何让引导下拉菜单在其父组件之外可见?角
- javascript - 用于自动幻灯片的 Javascript 代码在单独的 .js 文件中不起作用,但在 html 中起作用
- json - Apache Kafka 生产者 - 消费者 Web 服务