如何在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
相关产品推荐
相关产品推荐

