You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GatsbyJs自定义Posts schema与本地markdown数据源关联问题咨询

你自定义的Posts节点仅声明了字段结构,没有生成对应实体节点,所以无法查询到数据。allMarkdownRemark能返回结果,是因为gatsby-transformer-remark插件默认将markdown文件转成了MarkdownRemark类型的节点,你需要将这部分数据和Posts类型做关联,有两种常用实现方案:

方案1:直接修改transformer-remark配置(最简便)

直接通过gatsby-transformer-remark的typeName配置,将你指定目录下的markdown文件直接生成为Posts类型节点,无需额外写节点创建逻辑:
修改gatsby-config.js中gatsby-transformer-remark的配置:

{
  resolve: `gatsby-transformer-remark`,
  options: {
    // 匹配sourceInstanceName为Posts的markdown文件,生成Posts类型节点
    typeName: ({ node }) => node.sourceInstanceName === 'Posts' ? 'Posts' : 'MarkdownRemark',
    // 保留你原有其他remark配置即可
    plugins: []
  }
}

配置完成后,你之前写的Posts类型结构定义可以保留,用来固定字段结构避免自动推断异常。

方案2:手动创建Posts节点

如果你需要额外的自定义逻辑,可以在gatsby-node.js中通过sourceNodes钩子主动查询MarkdownRemark节点,批量生成Posts节点:

exports.sourceNodes = async ({ actions, createNodeId, createContentDigest, graphql }) => {
  const { createNode } = actions

  // 查询所有markdown解析后的节点
  const queryResult = await graphql(`
    query {
      allMarkdownRemark {
        nodes {
          html
          rawMarkdownBody
          fileAbsolutePath
        }
      }
    }
  `)

  // 遍历生成Posts节点
  queryResult.data.allMarkdownRemark.nodes.forEach(markdownNode => {
    createNode({
      // 匹配你定义的Posts字段
      html: markdownNode.html,
      rawMarkdownBody: markdownNode.rawMarkdownBody,
      fileAbsolutePath: markdownNode.fileAbsolutePath,
      // Gatsby节点必填元数据
      id: createNodeId(`post-${markdownNode.fileAbsolutePath}`),
      parent: null,
      children: [],
      internal: {
        type: 'Posts',
        contentDigest: createContentDigest(markdownNode)
      }
    })
  })
}

生效操作

修改完代码后执行以下命令重启服务,清空旧缓存避免异常:

gatsby clean && gatsby develop

重启后打开GraphQL playground即可正常查询allPosts接口获取数据。

内容的提问来源于stack exchange,提问作者Romeo Mihalcea

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 11:06:02