【问题标题】:Nestjs-create custom json response from entity classNestjs-从实体类创建自定义 json 响应
【发布时间】:2020-08-27 19:57:01
【问题描述】:

我正在使用 typeorm 和 MySQL。我的实体存储不同类型的运动数据,例如 Football, Athletics->100m,200m,400m。

在 get 调用中,我希望按 athletics 或 football 的游戏类型对数据进行分组,并希望创建如下所示的嵌套 JSON

JSON 格式: {

  "footBall":[
       {"location":"use",gameType:"footbal", "goals":2,"result":"won"},
       {"location":"use",gameType:"footbal", "goals":1,"result":"draw"}
    ],

    "athletics":[
         {"location":"poland",gameType:"athletics", gameSubType:"100m", "rank":2,"result":"first place"},
         {"location":"ireland",gameType:"athletics", gameSubType:"200m", "rank":1,"result":"second place"}
      ]

}

我的实体类是这样的:

  @Entity('competition')
export class CompetitionEntity {
    @PrimaryGeneratedColumn()
    id:Number

    @Column({ type: 'timestamp', default: () => "CURRENT_TIMESTAMP"})
    date:Date

    @Column()
    location:String

    @Column()
    rank:Number

    @Column()
    eventType: string

    @Column()
    minutes: number

    @Column()
    seconds: number

    @Column()
    miliseconds: number

    @Column()
    gameType: string  //it can take values like athletics or football or baseball etc

    @Column()
    gameSubType: string //it can take value like 100m, 200m, relay etc
}

在服务中,我编写了这样的代码来获取竞争表中的所有数据

    const qb = await getRepository(CompetitionEntity)
        .createQueryBuilder('competition')


    const competitions = await qb.getMany();

获取结果表单数据库后,我想按游戏类型列分组数据并将其作为嵌套 json 发送。

请指导我

谢谢大家

【问题讨论】:

    标签: typescript serialization nestjs typeorm class-transformer


    【解决方案1】:

    您可以通过这种方式迭代结果集并分组您的结果

    const competitions = await qb.getMany().then(results => {
      return results.reduce((prev, curr) => {
        if (!prev[curr.gameType]) {
          prev[curr.gameType] = [];
        }
        prev[curr.gameType].push(curr);
        return prev;
      }, {})
    });
    

    【讨论】:

    • 您的解决方案对我有帮助,但服务中方法的返回类型是什么?因为这个逻辑最后会创建对象。现在收到 TS2740:类型“{}”缺少类型“”中的以下属性:长度、弹出、推送、连接和 26... async getAllCompetition(userId: number):Promise{ return Competitions }
    • 返回类型为对象:{}。执行此代码的函数需要数组,但您需要的结构是对象
    • 以这种方式增强你的功能
    • async getAllCompetition(userId: number):Promise<any[]>{ return competitions } 或完全删除返回类型async getAllCompetition(userId: number) { return competitions }
    • 我的问题似乎解决了。最后一个问题如果我想在分组数据后返回实体类型的数组(例如: CompetitionEntity[])怎么办......我需要如何更改我的 json 响应和代码
    猜你喜欢
    • 2022-08-07
    • 1970-01-01
    • 2015-02-08
    • 2014-07-04
    • 2022-11-21
    • 2020-01-09
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多