У меня есть простой прототип 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
}
}
}
}
`;