GraphQL 中的复杂查询变量(通过 Gatsby)

Posted

技术标签:

【中文标题】GraphQL 中的复杂查询变量(通过 Gatsby)【英文标题】:Complex query variables in GraphQL (via Gatsby) 【发布时间】:2019-10-13 22:00:18 【问题描述】:

gatsby-plugin-intl 的帮助下,我正在使用 Gatsby 构建一个本地化的静态网站。这个插件给页面(包括基于模板的页面)添加了一个名为intl的上下文变量,它是一个对象:https://github.com/wiziple/gatsby-plugin-intl/blob/master/src/gatsby-node.js#L27-L34

我想从页面查询的上下文中访问intl.language 变量。这是我现阶段的(失败的)代码:

query($slug: String!, $intl: String) 
  contentfulPerson(slug: eq: $slug, node_locale: eq: $intl.language) 
    name
  

Contentful 是我使用的无头 CMS,我希望从中获取正确语言环境中的数据。

显然这段代码有两个问题:$intl 不是字符串,$intl.language 在语法上不正确。但我不知道如何解决这两个问题。

我想我可以分叉插件或在我自己的gatsby-node.js 中做一些事情,以使语言在上下文中作为***变量可用,但我很想知道是否有办法做到这一点直接地。 Gatsby 文档说查询变量可能很复杂 (https://www.gatsbyjs.org/docs/graphql-reference/#query-variables),但在他们提供的示例中,他们没有显示如何定义类型或如何访问这些变量中的属性。


编辑:我尝试使用以下代码将语言移动到我的gatsby-node.js 中的***上下文变量:

exports.onCreatePage = (page, actions) => 
  const  createPage, deletePage  = actions
  deletePage(page)
  createPage(
    ...page,
    context: 
      ...page.context,
      language: page.context.intl.language
    
  )

但程序内存不足(即使增加max_old_space_size

【问题讨论】:

这不是我个人必须处理的问题,但我对此进行了一些研究。我认为查看this repo 可能会帮助您解决问题。之后你可以查看pages/index.jsx,看看他们是如何查询的。 感谢@FranklinFarahani 的参考。我确实遇到过,但不幸的是,在这种情况下,语言可以直接作为***变量使用,这使得查询变得容易。 【参考方案1】:

您可以通过执行以下操作将language 字段移动到***上下文:

exports.onCreatePage = ( page, actions ) => 
  const  createPage, deletePage  = actions
  const oldPage = Object.assign(, page)

  page.context.language = page.context.intl.language;
  if (page.context.language !== oldPage.context.language) 
    // Replace new page with old page
    deletePage(oldPage)
    createPage(page)
  

检查字段是否已更改可避免无限循环。

【讨论】:

玩得好!谢谢:) 工作就像一个魅力!

以上是关于GraphQL 中的复杂查询变量(通过 Gatsby)的主要内容,如果未能解决你的问题,请参考以下文章

为啥 GraphQl 强制您匹配查询中的变量要求?

使用数组作为 GraphQL 查询的变量

graphql 验证

如何通过 AWS AppSync 客户端将保存字符串的变量传递给 GraphQL 查询?

GraphQL:variableValues 中的意外变量:首先在 args 中不使用变量时

Apollo GraphQL 一次查询中的多个 ID 变量