首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何让GraphQL等待来自单独回购的帖子?

如何让GraphQL等待来自单独回购的帖子?
EN

Stack Overflow用户
提问于 2019-02-02 00:50:07
回答 1查看 86关注 0票数 0

我有我的博客文章在一个独立的回购网站的结构。

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

当我第一次运行下载-git-repo时,我使用的是NPM包gatsby build,在GraphQL尝试使用它们之前,似乎没有加载这些帖子。

GraphQLError: Cannot query field "allMarkdownRemark" on type "Query".

第二次运行gatsby build不会返回错误。

gatsby-node.js中的第3-5行是我导入博客帖子回购的代码。

我如何编写这段代码,以便在GraphQL查找这些帖子之前加载它们?

代码语言:javascript
复制
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,
    })
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-02 07:10:14

也许‘下载’是异步发生的,所以当盖茨比运行时,博客数据还没有出现吗?

您应该在钩子中下载回购。这发生在盖茨比开始从插件读取配置之前&站点的构建数据。

也许就像

代码语言:javascript
复制
// gatsby-node.js

exports.onPreBootstrap = () => new Promise(( res, rej ) => {
  download(‘...’, ‘...’, (err) => {
    if (err) rej(err);
    else res();
  })
})
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54488955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档