Gatsby报错Field 'banner'无选择项:如何保留banner并正常显示?
这个错误的核心原因很明确:你的publications.mdx里banner是纯字符串格式的图片路径,但GraphQL查询里却试图读取它的子字段publicURL——字符串类型本身没有子字段,自然会报错。下面给两种符合需求的修复方案:
方案1:直接用字符串路径做背景图(快速修复)
如果不想改动MDX里的banner格式,直接调整查询和组件用法即可:
- 修正Post.tsx中的GraphQL查询
把原来带子字段的查询:
query($slug: String!) { mdx(slug: {eq: $slug}) { banner { publicURL } # 其他字段... } }
改成直接取字符串字段:
query($slug: String!) { mdx(slug: {eq: $slug}) { banner # 去掉子查询,直接获取字符串路径 # 其他字段... } }
- 在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节点:
- 配置图片目录扫描
在gatsby-config.js里确保图片目录被gatsby-source-filesystem覆盖:
module.exports = { plugins: [ { resolve: `gatsby-source-filesystem`, options: { name: `images`, path: `${__dirname}/src/images/`, // 替换成你的图片实际路径 }, }, // 其他插件... ], }
修改MDX中的Banner路径为相对路径
比如把banner: "/images/my-banner.jpg"改成banner: "./src/images/my-banner.jpg"(根据你的目录结构调整)。添加自定义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, }) }, }, }, }) }
- 恢复原GraphQL查询
现在就可以正常读取publicURL了:
query($slug: String!) { mdx(slug: {eq: $slug}) { banner { publicURL } # 其他字段... } }
之后在Header组件里用banner.publicURL作为背景图路径,还能进一步结合gatsby-image做图片优化。
内容的提问来源于stack exchange,提问作者NobinPegasus
相关产品推荐
相关产品推荐

