【问题标题】:Automatically parse query parameter to object when defined in NestJS在 NestJS 中定义时自动将查询参数解析为对象
【发布时间】:2019-02-17 10:50:09
【问题描述】:

我正在编写一个 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 文档写得非常好,但缺少关于放置内容的指导。

是否有人在将 Query 参数用于 NestJS 之前遇到了类似的问题,并且可以解释在 NestJS 中哪种方法最好?

这个问题可能看起来像是一个基于意见的问题,但是我正在寻找应该考虑到 NestJS 哲学的方法。

【问题讨论】:

    标签: nestjs


    【解决方案1】:

    管道可能是完成此任务的最简单方法。您可以添加将在每个端点上调用的全局管道,而不是为每个端点定义添加管道。在你的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;
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多