Сложные переменные запроса в GraphQL (через Гэтсби)

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


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

Это не проблема, с которой мне приходилось сталкиваться лично, но я провел некоторое исследование по этому вопросу. Я думаю, просмотр это репо может помочь вам решить вашу проблему. Вы можете посмотреть на pages/index.jsx позже, чтобы увидеть, как они запросили его.

Franklin Farahani 29.05.2019 09:51

Спасибо за ссылку @FranklinFarahani. Я сталкивался с этим, но, к сожалению, в этом случае язык доступен напрямую как переменная верхнего уровня, что упрощает запрос.

Arnaud 29.05.2019 13:44
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
6
2
1 063
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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)
  }
}

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

Отлично сработано! Спасибо :)

Arnaud 24.06.2019 13:48

Работал как шарм!

Shahid 24.07.2019 03:11

Другие вопросы по теме