GraphQL Clojure:获取 GQL 查询字段

Posted

技术标签:

【中文标题】GraphQL Clojure:获取 GQL 查询字段【英文标题】:GraphQL Clojure: Getting the GQL query fields 【发布时间】:2020-05-29 08:46:57 【问题描述】:

我正在为我的 GraphQL Clojure 服务器使用 lacinia 库。 对于这个简单的架构:

input QueryConfig 
  startDate: String!
  endDate: String!



type MyData
  x: Float!
  y: Float!
  z: Float!


schema 
    query: Query


type Query 
  myQuery(config:QueryConfig) : [MyData]

我发布以下查询:


  myQuery(config:startDate:"2020-01-01",endDate:"2020-01-01")
    x
  

在我的解析器代码中,我想知道询问了哪些字段(上面示例中的 x),因此我不会从我的数据库中过度获取结果并检索 x 值。

在解析器代码中,上下文包含 :graphql-query 键,其中包含整个查询。但是,解析查询文本似乎很尴尬。

(defn my-resolver
  [context args value]
  ;TODO find out what fields were asked and fetch from DB
  )

获取查询字段的正确方法是什么?

【问题讨论】:

【参考方案1】:

来自docs:

也可以获取所有将被选中的字段,使用 选择序列。这是一个懒惰的、广度优先的导航所有领域 选择树。

因此您可以使用:(executor/selections-seq context) 获取查询发送的所有字段。

【讨论】:

【参考方案2】:

Lacinia 确实允许您预览嵌套选择:

字段解析器可以“预览”将在其下方选择哪些字段 在选择树中。这是一个经常用来优化的工具 数据检索操作。

来自docs的示例代码:

(require
  '[com.walmartlabs.lacinia.executor :as executor])

(defn resolve-hero
  [context args _]
  (if (executor/selects-field? context :character/friends)
    (fetch-hero-with-friends args)
    (fetch-hero args)))

【讨论】:

以上是关于GraphQL Clojure:获取 GQL 查询字段的主要内容,如果未能解决你的问题,请参考以下文章

为啥 WebStorm 在 Vue 组件或 .graphql 文件中的 apollo 对象内的 gql 查询中显示错误

嵌套查询 GraphQl

GraphQL - 有条件地获取字段

从 .gql 文件中命名导出多个 graphql 操作

如何将GraphQL查询作为字符串而不是对象导入

如何将参数传递给graphql查询?