Как запросить данные из 2 API - PullRequest
2 голосов
/ 04 февраля 2020

Я установил клиент Gatsby, который подключается к Contentful с помощью плагина gatsby-source-contentful. Я также подключил простой пользовательский API, который подключается с помощью плагина gatsby-source-graphql.

  • Когда я запускаю dev-сервер, я могу запрашивать свои страницы из Contentful на игровой площадке.
  • Я также могу запрашивать свой пользовательский API через игровую площадку.
  • Так что оба API работают и правильно связаны с Гэтсби.

Я хочу программно сгенерировать кучу страниц с динамическими c разделами (ссылками), которые автор может добавить и упорядочить по своему усмотрению.

Я достигаю этого, используя соединение ...on Node вместе с фрагментами, которые я определяю в каждом из них. раздел Dynami c. Пока все работает хорошо.

Моя актуальная проблема:

Теперь у меня есть секция динамического c, которая является списком вакансий. Этот компонент требует извлечения данных из Contentful API, поскольку он хранит значения, такие как широта и долгота Таким образом, автор имеет право установить точку на карте и установить радиус. Я успешно получаю эту информацию из Contentful, используя фрагмент внутри компонента:

export const query = graphql `
fragment JoblistModule on ContentfulJoblisteMitAdresse {
  ... on ContentfulJoblisteMitAdresse {
    contentful_id
    radius
    geo {
      lon
      lat
    }
  }
}`

Но как я могу передать эту информацию в другой запрос, который выбирает данные задания из моего пользовательского API? Если я правильно понимаю Гэтсби, мне как-то нужно соединить эти два API вместе? Или я могу выполнить другой запрос, который выбирает эти значения, передаваемые как переменные? Как и где мне этого добиться?

Я не смог найти никакого подхода ни внутри gatsby-node.js (поскольку передаваемый контекст можно использовать только как переменные внутри запроса), ни в файле шаблона (так как Я могу выполнить только 1 запрос за раз), ни в самом компоненте (поскольку он принимает только staticQuery)

Я не знаю, где мое недоразумение. Поэтому я был бы очень признателен за любые советы, помощь или примеры.

1 Ответ

2 голосов
/ 28 февраля 2020

Поскольку ваш пользовательский API является API-интерфейсом GraphQL, вы можете использовать DelegateToSchema из пакета graphql-tools для выполнения sh этого.

Вам потребуется создать распознаватель с помощью Gatsby's setFieldsOnGraphQLNodeType API. Внутри этого распознавателя ваша функция разрешения будет вызывать delegateToSchema.

У нас похожая проблема, в наших сообщениях в блоге есть поле автора, содержащее идентификатор. Затем мы делаем запрос GraphQL к другой системе, чтобы найти информацию об авторе по этому идентификатору.

return {
        remoteAuthor: {
          type: person,
          args: {},
          resolve: async (source: ContentfulBlogPost, fieldArgs, context, info) => {
            if (!source.author) {
              return null
            }

            // runs the selection on the remote schema
            // https://github.com/gatsbyjs/gatsby/issues/14517
            return delegateToSchema({
              schema: authorsSchema,
              operation: 'query',
              fieldName: 'Person',
              args: { id: source.author },
              context,
              info,
            })
          },
        },
      }

Это добавляет поле 'remoteAuthor' к нашему типу поста в блоге, и всякий раз, когда его запрашивают, эти выборы передаются через прокси. в удаленную схему, где существует тип person.

...