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

时间:2019-05-28 11:23:00

标签: graphql gatsby

我正在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,我希望从该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

1 个答案:

答案 0 :(得分: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)
  }
}

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