У меня есть сообщения в блоге в отдельном репо от структуры сайта.
Это отделяет коммиты для кода сайта от коммитов для обновлений контента. Люди также могли отправлять запросы на включение для исправления ошибок в сообщениях блога.
Я использую пакет NPM скачать-git-repo. При первом запуске gatsby build кажется, что сообщения не загружаются до того, как GraphQL пытается с ними работать.
GraphQLError: Cannot query field "allMarkdownRemark" on type "Query".
Запуск gatsby build во второй раз не возвращает ошибку.
Строки 3-5 в gatsby-node.js — это мой код для импорта репозитория сообщений в блоге.
Как я могу написать этот код, чтобы сообщения загружались до того, как GraphQL их ищет?
const path = require('path')
const { createFilePath, createFileNode } = require(`gatsby-source-filesystem`)
const download = require('download-git-repo')
download('jastuccio/blog-posts', 'src/pages/blog-posts', function(err) {
console.info(err ? 'Error' : 'Success')
})
exports.createPages = ({ actions, graphql }) => {
const { createPage } = actions
const blogPostTemplate = path.resolve(`src/templates/blog-post.js`)
return new Promise((resolve, reject) => {
resolve(
graphql(`
{
allMarkdownRemark(
sort: { order: DESC, fields: [frontmatter___date] }
limit: 1000
) {
edges {
node {
fields {
slug
}
frontmatter {
title
}
}
}
}
}
`).then(result => {
if (result.errors) {
console.info(result.errors)
return reject(result.errors)
}
const blogTemplate = path.resolve('./src/templates/blog-post.js')
result.data.allMarkdownRemark.edges.forEach(({ node }) => {
createPage({
path: node.fields.slug,
component: blogTemplate,
context: {
slug: node.fields.slug,
}, // additional data can be passed via context
})
})
return
})
)
})
}
exports.onCreateNode = ({ node, getNode, actions }) => {
const { createNodeField } = actions
if (node.internal.type === `MarkdownRemark`) {
const slug = createFilePath({ node, getNode, basePath: `pages` })
createNodeField({
node,
name: `slug`,
value: slug,
})
}
}





Возможно, «загрузка» происходит асинхронно, поэтому к моменту запуска gatsby данных блога еще нет?
Вы должны скачать репо в крючок onPreBootstrap. Это происходит до того, как gatsby начнет читать конфигурацию из плагина и собирать данные для сайта.
Может быть, что-то вроде
// gatsby-node.js
exports.onPreBootstrap = () => new Promise(( res, rej ) => {
download(‘...’, ‘...’, (err) => {
if (err) rej(err);
else res();
})
})