GraphQL 选择集解析
Posted
技术标签:
【中文标题】GraphQL 选择集解析【英文标题】:GraphQL selection set parsing 【发布时间】:2021-03-21 22:03:54 【问题描述】:我的 AppSync Lambda 解析器中有这个 GraphQL 选择集:
recommendationId
items
id
name
我需要items
中的选择集,这将是严重嵌套的。
我怎样才能得到这个输出?
id
name
上下文(将业务对象替换为Object
):
schema.graphql
type Object
id: ID!
name: String!
type Query
getObjectsById(objectsById: ObjectsByID!): [Object]
listRecommendedObjects(personId: ID!): RecommendedObjects
input ObjectsByID
ids: [ID!]!
type RecommendedObjects
items: [Object]
recommendationId: String
内部解析器:
const buildQuery = (selectionSetGraphQL) =>
`query MyQuery($objectsById: ObjectsByID!)
getObjectsById(objectsById: $objectsById) $selectionSetGraphQL
`
目标:
调用 listRecommendedObjects 将调用自定义 lambda,该 lambda 将与 AWS Personalize 对话以获取项目 ID。
然后,我想使用 Object
的选择集在该 Lambda 中调用 getObjectsById 以从 Personalize 获取项目 ID 的数据
【问题讨论】:
只需遍历选择集的字段,直到找到items
一个? javascript代码在哪里?
不是对象,是字符串。
等等,你还没有解析查询?请发布正在处理此问题的代码以提供一些上下文。
@Bergi 我确实使用信息对象:docs.aws.amazon.com/appsync/latest/devguide/…
@Bergi 可以使用 graphql-js。谢谢
【参考方案1】:
我使用graphql-js
得到了一个明智的解决方案。
我使用parse
,然后选择我需要的,然后将其转换回带有print
的字符串
const parse, print = require("graphql/language")
const document = parse(' id items id name ')
const subSet = document
.definitions[0]
.selectionSet
.selections
.find(elem => elem.name.value == 'items')
print(subSet) // => `items id name`
【讨论】:
以上是关于GraphQL 选择集解析的主要内容,如果未能解决你的问题,请参考以下文章
《GraphQL 名词 101:解析 GraphQL 的查询语法》译
GraphQL 可以选择性地解析解析器中给定查询结果的字段吗?