我的博客文章与网站的结构位于单独的存储库中。
这将站点代码的提交与内容更新的提交分开。人们还可以在博客文章中提交拉式请求以进行错误更正。
我正在使用NPM软件包download-git-repo,第一次运行gatsby build
时,似乎没有在GraphQL尝试使用它们之前加载帖子。
GraphQLError: Cannot query field "allMarkdownRemark" on type "Query".
第二次运行gatsby build
不会返回错误。
我在gatsby-node.js中的3-5行是导入博客文章存储库的代码。
我怎么能写这样的代码,这样的职位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.log(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.log(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,
})
}
}
答案 0 :(得分:1)
也许“下载”是异步发生的,因此受到时间的盖茨比运行时,博客的数据是不存在了吗?
您应该下载回购onPreBootstrap
hook。发生这种情况之前盖茨比开始读取来自插件&构建数据配置的网站。
也许像
// gatsby-node.js
exports.onPreBootstrap = () => new Promise(( res, rej ) => {
download(‘...’, ‘...’, (err) => {
if (err) rej(err);
else res();
})
})