You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在AppSync GraphQL Schema中以ID作为键返回对象?

解决GraphQL Schema动态键对象定义问题

你写的AccessPointsByBuilding类型违反了GraphQL的规范——GraphQL对象类型的字段必须是明确命名的标识符,不能直接用String作为动态字段名。针对你需要返回的键值对结构,这里有几种实用的解决办法:

方法1:用JSON标量直接接收动态结构

如果你的GraphQL服务器支持JSON标量(比如Apollo Server自带这个类型),可以直接把accessPoints定义为JSON类型,这样就能原样返回你想要的动态键值对象:

type Group {
  groupName: String!
  groupDescription: String!
  id: String!
  groupId: String!
  accessPoints: JSON!
}

要是服务器没内置JSON标量,你得自己定义一个:

scalar JSON

type Group {
  # 其他字段保持不变
  accessPoints: JSON!
}

之后在解析层实现这个标量的序列化和反序列化逻辑就行(比如Node.js里直接用JSON.stringify和JSON.parse处理)。

方法2:把动态结构转成固定列表

如果不想用JSON标量,也可以把键值对结构重构为固定字段的对象列表,比如定义一个AccessPointEntry类型:

type Group {
  groupName: String!
  groupDescription: String!
  id: String!
  groupId: String!
  accessPoints: [AccessPointEntry!]!
}

type AccessPointEntry {
  buildingId: String!
  accessPointIds: [String!]!
}

对应的返回数据要改成这种结构:

{
  // 其他字段不变
  accessPoints: [
    {
      buildingId: "e1274504-b471-427c-a63b-dd9aba46a118",
      accessPointIds: [
        "89d9ef1c-7781-498b-a2ef-e0a107ad24e9",
        "fd9fe18e-f67a-42b3-b44c-cfa264532ffd"
      ]
    }
  ]
}

这种方式更贴合GraphQL的强类型设计,客户端查询时也能明确拿到对应字段。

方法3:用扩展的Map类型(部分服务器支持)

有些GraphQL服务器(比如Apollo Server)支持扩展的Map标量,可以直接表示键值对结构:

type Group {
  # 其他字段不变
  accessPoints: Map[String, [String!]]!
}

注意这不是标准GraphQL规范,得先确认你的服务器支持这个扩展类型。


内容的提问来源于stack exchange,提问作者Zain Ul Abideen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 05:10:21