?
Я начинаю свой первый проект с Gatsby и столкнулся с проблемой при запросе данных, которые «могут» не всегда существовать. Вот мой файл gatsby-node.js:
const path = require('path');
const _ = require('lodash');
// Lifecycle methods
function attachFieldsToBlogPost({ node, actions }) {
if (node.internal.type !== 'MarkdownRemark') {
return;
}
const { createNodeField } = actions;
const { slug, title } = node.frontmatter;
const postPath = slug || _.kebabCase(title);
createNodeField({
node,
name: 'slug',
getter: node => node.frontmatter.slug, // eslint-disable-line no-shadow
value: postPath,
});
createNodeField({
node,
name: 'url',
value: postPath,
});
}
exports.onCreateNode = function() { // eslint-disable-line func-names
return Promise.all([attachFieldsToBlogPost].map(fn => fn.apply(this, arguments))); // eslint-disable-line prefer-rest-params
};
// Implementations
function getMarkdownQuery({ regex } = {}) {
return `
{
allMarkdownRemark(
sort: { fields: [frontmatter___date], order: DESC }
filter: { fileAbsolutePath: { regex: "${regex}" } }
) {
totalCount
edges {
node {
fileAbsolutePath
excerpt(pruneLength: 280)
timeToRead
frontmatter {
title
date
slug
}
fields {
url
slug
}
}
}
}
}
`;
}
function createBlogPostPages({ edges, createPage }) {
const component = path.resolve('src/templates/Post.js');
edges.forEach(({ node }) => {
const { slug, title } = node.frontmatter;
const postPath = slug || _.kebabCase(title);
createPage({
path: postPath,
component,
context: {
slug: postPath,
},
});
});
}
exports.createPages = async({ actions, graphql }) => {
const results = await Promise.all([
graphql(getMarkdownQuery({ regex: '/src/posts/' })),
]);
const error = results.filter(r => r.errors);
if (error.length) {
return Promise.reject(error[0].errors);
}
const [blogPostResults] = results;
const { createPage } = actions;
const blogPostEdges = blogPostResults.data.allMarkdownRemark.edges;
createBlogPostPages({
createPage,
edges: blogPostEdges,
});
};
И мой пример содержания сообщения в блоге:
---
title: 'Hello world there'
date: '2018-08-25'
---
Here is some content.
```javascript
console.info('test')
```
Когда я поставляю компонент внешнего интерфейса slug, страница создается, как задумано. Но я бы хотел использовать параметр slug только тогда, когда он доступен (следовательно, проверьте, доступен ли интерфейс как в attachFieldsToBlogPost, так и в createBlogPostPages). Если я удалю элемент передней панели slug, я получаю следующую ошибку:
GraphQLError: Cannot query field "slug" on type "frontmatter".
Есть ли способ переопределить путь, используемый для создания страниц сообщений, «если» там присутствует обложка slug?
Надеюсь, это не слишком расплывчато, поскольку это мой первый проект Gatsby, но кажется довольно полезной функцией. Спасибо!



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Если вы удалите все случаи slug, это поле больше не будет существовать во внутренней схеме Гэтсби. Вероятно, вы столкнулись с проблема, описанная здесь.
Пока у вас есть хотя бы 1 файл уценки с полем slug, он будет существовать в автоматизированной схеме GraphQL Gatsby, и тогда ваша условная логика должна работать.
Не только ты, это определенно круто. Любая автоматическая генерация схемы всегда будет сталкиваться с подобными проблемами, а ручная генерация схем добавит кучу работы с очень небольшим выигрышем ...
?Спасибо за ответ! Имеет смысл. Я также натолкнулся на это и понял, что мне, вероятно, следует просто пойти по пути создания файла «чертежа», а затем просто удалить его из того, что на самом деле анализируется / используется для создания страниц. Я думаю, немного странно из-за того, как я привык запрашивать данные, но я новичок в GraphQL. Еще раз спасибо!