Подать результат одного запроса graphql в другой? - PullRequest
0 голосов
/ 15 ноября 2018

Почему мне нужно это сделать: я использую graphql + gatsby + contentful.Я использую поле расширенного текста в Contentful, которое позволяет вставлять ссылки на объекты внутри уценки.Я хотел бы отобразить встроенную запись.

Мой запрос выглядит следующим образом:

export const pageQuery = graphql`
  query BlogPostBySlug($slug: String!) {
      richTextField {
        content {
            nodeType
            data {
                target {
                    sys {
                        id
                    }
                }
            }
        }
      }
    }
  }
`

richTextField.content возвращается в следующем виде:

{
  "data": {
    "target": {
      "sys": {
        "id": "5wVh2a6XvySacEioOEMyqQ",
      }
    }
  },
}

Идентификатор "5wVh2a6XvySacEioOEMyqQ" является ссылкойв другую запись базы данных.Я вижу два возможных способа, как это может работать:

  1. Какой-то способ сообщить graphql, что id в запросе относится к другой модели базы данных и имеет автоматическое заполнение полей.Возможно ли это?

  2. Получите результаты этого запроса, соберите все идентификаторы и создайте другой запрос, в котором он ищет записи с этими идентификаторами.Кажется, что Аполлон может быть решением, но он не работает с Гэтсби.Возможно ли это?

Как лучше всего это сделать?

Спасибо!:)

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Вы можете попробовать использовать внешние ключи , чтобы связать узлы.

В ваш файл gatsby-node.js вам нужно добавить ключ, добавленный к ___NODE с идентификатором узла sys для ссылки:

exports.sourceNodes = async ({ getNodes, actions, createContentDigest }) => {
  // find all the sys nodes - you'll need to alter this filter to get the right one
  const sysNodes = getNodes().filter(node => node.internal.type === 'File');

  // go through the posts to map the sys nodes
  // these nodes may already exist, so you could filter `getNodes` like above
  const postData = howeverYouGetDataFromContentful();

  postData.forEach(post => {
    const sys = sysNodes.find(embedded => embedded.id === post.data.target.embedded.id);

    // This will create a brand-new node.
    // If your posts already exist, then use `createNodeField` mentioned below
    const node = {
      id: post.id,
      children: [],
      internal: {
        type: 'post',
        mediaType: 'text/json',
        contentDigest: createContentDigest(JSON.stringify(post))
      },
      sys___NODE: sys.id
    };

    actions.createNode(node);
  });
}

Если к моменту вызова sourceNodes узлы уже существуют (что они, вероятно, будут с Contentful), то вы можете отфильтровать их, используя getNodes. Вам также, вероятно, нужно будет использовать createNodeField вместо createNode, как указано здесь: https://github.com/gatsbyjs/gatsby/issues/3129#issuecomment-360927436, чтобы избежать воссоздания узлов.

0 голосов
/ 16 ноября 2018

Поле richtext довольно новое, и похоже, что оно еще не решено.Возможно, было бы хорошо дать людям Гэтсби больше информации здесь , чтобы они могли прогрессировать.

...