如何让GraphQL等待来自单独存储库的帖子?

时间:2019-02-02 00:50:08

标签: gatsby

我的博客文章与网站的结构位于单独的存储库中。

这将站点代码的提交与内容更新的提交分开。人们还可以在博客文章中提交拉式请求以进行错误更正。

我正在使用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,
    })
  }
}

1 个答案:

答案 0 :(得分:1)

也许“下载”是异步发生的,因此受到时间的盖茨比运行时,博客的数据是不存在了吗?

您应该下载回购onPreBootstrap hook。发生这种情况之前盖茨比开始读取来自插件&构建数据配置的网站。

也许像

// gatsby-node.js

exports.onPreBootstrap = () => new Promise(( res, rej ) => {
  download(‘...’, ‘...’, (err) => {
    if (err) rej(err);
    else res();
  })
})