Ошибка дублирования графических документов при получении нескольких типов данных в Gatsby-node.js - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть простой прототип Gatsby, который использует Kentico Cloud в качестве источника данных.К счастью для меня, они уже создали исходный плагин , который я использую для извлечения одного типа данных, называемого BlogPost.Это работает, как и ожидалось.

gatsby-node.js source

const path = require(`path`);

exports.createPages = ({graphql, actions}) => {
    const { createPage } = actions;
    return new Promise((resolve, reject) => {
        graphql(`
        {
            allKenticoCloudItemBlogPost {
              edges {
                node {
                  elements {
                    url_slug{
                      value
                    }
                  }
                }
              }
            }
          }
        `).then(result => {        
            console.log(result);
            result.data.allKenticoCloudItemBlogPost.edges.map(({node}) => {
                createPage({
                    path: `${node.elements.url_slug.value}`,
                    component: path.resolve(`./src/templates/blog-post.js`),
                    context: {
                        slug: node.elements.url_slug.value,
                    },
                })
            })
            resolve();
        })
    });

}

Это прекрасно работает, но я действительно хочу добавить второй тип данных под названием «Статьи»

Следуя примеру шаблона Gatsby Kentico Starter , я изменил свой файл gatsby-node.js

const path = require(`path`);

exports.createPages = ({graphql, actions}) => {
    const { createPage } = actions;

    return new Promise((resolve, reject) => {
        graphql(`
        {
          allKenticoCloudItemBlogPost {
            edges {
              node {
                elements {
                  url_slug{
                    value
                  }
                }
              }
            }
          }
          allKenticoCloudItemArticle{
            edges{
              node{
                elements{
                  url_slug{
                    value
                  } 
                }
                internal{
                  type
                }
              }
            }
          }
        }
        `).then(result => {
            console.log('START HERE');        
            console.log(JSON.stringify(result));
            result.data.allKenticoCloudItemBlogPost.edges.map(({node}) => {
              createPage({
                  path: `${node.elements.url_slug.value}`,
                  component: path.resolve(`./src/templates/blog-post.js`),
                  context: {
                      slug: node.elements.url_slug.value,
                  },
              })
            });
            result.data.allKenticoCloudItemArticle.edges.map(({node}) => {
              createPage({
                path: `${node.elements.url_slug.value}`,
                component: path.resolve(`./src/templates/article.js`),
                context: {
                  slug: node.elements.url_slug.value,
                },
              })
            })
            resolve();
        })
    });
}

Как видите, я зарегистрировал результаты такЯ мог видеть, как они выглядят.

console.log(JSON.stringify(result));

Производит

{
  "data": {
    "allKenticoCloudItemBlogPost": {
      "edges": [
        {
          "node": { "elements": { "url_slug": { "value": "my-first-post" } } }
        },
        {
          "node": {
            "elements": { "url_slug": { "value": "my-second-blog-post" } }
          }
        },
        { "node": { "elements": { "url_slug": { "value": "3rd-blog-post" } } } }
      ]
    },
    "allKenticoCloudItemArticle": {
      "edges": [
        {
          "node": {
            "elements": { "url_slug": { "value": "article-1-example" } },
            "internal": { "type": "KenticoCloudItemArticle" }
          }
        },
        {
          "node": {
            "elements": { "url_slug": { "value": "article-2" } },
            "internal": { "type": "KenticoCloudItemArticle" }
          }
        }
      ]
    }
  }
}

Пока все хорошо.Я вижу то, что ожидаю увидеть.

И когда я запускаю gatsby develop, он на самом деле успешно компилируется, но с ошибкой graphQL

Ошибка GraphQL Ошибка Произошла ошибка при компиляции запросов GraphQL вашего сайта.Ошибка: RelayParser: обнаружены повторяющиеся определения для одного или нескольких документов: каждый документ должен иметь уникальное имя.Дублированные документы: - templateBuilder

Я попытался решить эту проблему, поставив запятую после моего первого запроса BlogPost.

graphql(`
{
  allKenticoCloudItemBlogPost {
    edges {
      node {
        elements {
          url_slug{
            value
          }
        }
      }
    }
  },
  allKenticoCloudItemArticle{
    edges{
      node{
        elements{
          url_slug{
            value
          } 
        }
        internal{
          type
        }
      }
    }
  }
}

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

Это должно быть что-то маленькое, так как я смоделировал свой код после стартера Gatsby Kentico Source Plugin, который использует те же технологии, что и я.Я могу скачать и запустить этот проект без проблем.Так что я не уверен, что я делаю не так.

РЕДАКТИРОВАТЬ

Я решил это.Проблема была в шаблонах для каждого типа данных.Я назвал оба запроса как templateBuilder.Я изменил шаблон блога на blogBuilder, а шаблон статьи на articleBuilder.Работает как шарм сейчас.

article.js

export const query = graphql`
  query articleBuilder($slug: String!) {
    kenticoCloudItemArticle(elements: { url_slug: { value: { eq: $slug } } }) {
      elements {
        article_title {
          value
        }
        article_content {
          value
        }
        article_date {
          value
        }
        url_slug {
          value
        }
      }
    }
  }
`;

blog-post.js

export const query = graphql`
  query blogBuilder($slug: String!) {
    kenticoCloudItemBlogPost(elements: { url_slug: { value: { eq: $slug } } }) {
      elements {
        blog_title {
          value
        }
        blog_content {
          value
        }
        blog_date {
          value
        }
        url_slug {
          value
        }
      }
    }
  }
`;

1 Ответ

0 голосов
/ 25 февраля 2019

Проблема была в шаблонах для каждого типа данных.Я назвал оба запроса как templateBuilder.Я изменил шаблон блога на blogBuilder, а шаблон статьи на articleBuilder.

См. Выше правку для получения дополнительной информации и примеров кода.

...