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 的查询语法译

GraphQL 可以选择性地解析解析器中给定查询结果的字段吗?

graphql 的选择发生在哪一侧?

graphql-yoga - GraphQL 解析器参数在哪里定义和记录?

向 graphql-ruby 实现添加多个过滤器