Сложные переменные запроса в GraphQL (через Gatsby) - PullRequest
2 голосов
/ 28 мая 2019

Я создаю локализованный статический веб-сайт, используя Gatsby, с помощью gatsby-plugin-intl.Этот плагин добавляет контекстную переменную с именем 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, чтобы сделать язык доступным как переменная верхнего уровня в контексте,но мне интересно знать, есть ли способ сделать это напрямую.В документации Гэтсби говорится, что переменные запроса могут быть сложными (https://www.gatsbyjs.org/docs/graphql-reference/#query-variables), но в приведенном ими примере они не показывают, как определяются типы или как получить доступ к свойству в этих переменных.


EDIT: я пытался переместить язык в контекстную переменную верхнего уровня в моем 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 Ответ

2 голосов
/ 22 июня 2019

Вы можете переместить поле 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)
  }
}

Проверка, изменилось ли поле, позволяет избежать бесконечного цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...