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

Gatsby报错Field 'banner'无选择项:如何保留banner并正常显示?

解决Gatsby中Banner字段的GraphQL类型错误

这个错误的核心原因很明确:你的publications.mdx里banner是纯字符串格式的图片路径,但GraphQL查询里却试图读取它的子字段publicURL——字符串类型本身没有子字段,自然会报错。下面给两种符合需求的修复方案:

方案1:直接用字符串路径做背景图(快速修复)

如果不想改动MDX里的banner格式,直接调整查询和组件用法即可:

  1. 修正Post.tsx中的GraphQL查询
    把原来带子字段的查询:
query($slug: String!) {
  mdx(slug: {eq: $slug}) {
    banner {
      publicURL
    }
    # 其他字段...
  }
}

改成直接取字符串字段:

query($slug: String!) {
  mdx(slug: {eq: $slug}) {
    banner # 去掉子查询,直接获取字符串路径
    # 其他字段...
  }
}
  1. 在Header组件中使用路径
    把Header的背景图逻辑改成直接用这个字符串:
// Header.tsx
export default function Header({ banner }) {
  return (
    <header style={{
      backgroundImage: `url(${banner})`,
      backgroundSize: 'cover',
      backgroundPosition: 'center'
    }}>
      {/* 头部内容 */}
    </header>
  )
}

这样就能直接把MDX里的路径作为背景图URL使用。

方案2:转为Gatsby文件节点(支持图片优化)

如果想利用Gatsby的图片压缩、响应式等能力,可把banner字符串转为File节点:

  1. 配置图片目录扫描
    在gatsby-config.js里确保图片目录被gatsby-source-filesystem覆盖:
module.exports = {
  plugins: [
    {
      resolve: `gatsby-source-filesystem`,
      options: {
        name: `images`,
        path: `${__dirname}/src/images/`, // 替换成你的图片实际路径
      },
    },
    // 其他插件...
  ],
}
  1. 修改MDX中的Banner路径为相对路径
    比如把banner: "/images/my-banner.jpg"改成banner: "./src/images/my-banner.jpg"(根据你的目录结构调整)。

  2. 添加自定义Resolver转换类型
    在gatsby-node.js里加一段代码,把MDX的banner字符串转为File节点:

exports.createResolvers = ({ createResolvers }) => {
  createResolvers({
    Mdx: {
      banner: {
        type: `File`,
        resolve: async (source, args, context, info) => {
          return context.nodeModel.runQuery({
            query: {
              filter: {
                absolutePath: {
                  eq: `${__dirname}/${source.banner}`
                }
              }
            },
            type: `File`,
            firstOnly: true,
          })
        },
      },
    },
  })
}
  1. 恢复原GraphQL查询
    现在就可以正常读取publicURL了:
query($slug: String!) {
  mdx(slug: {eq: $slug}) {
    banner {
      publicURL
    }
    # 其他字段...
  }
}

之后在Header组件里用banner.publicURL作为背景图路径,还能进一步结合gatsby-image做图片优化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 07:26:05