如何在Gatsby的createSchemaCustomization中让GraphQL顶级类型非空?
解决Gatsby中顶级MarkdownRemark字段非空化的问题
要让Gatsby生成的GraphQL查询中顶级MarkdownRemark字段变为非空类型,可以通过以下两种方法实现:
方法一:通过createResolvers强制指定非空类型
在gatsby-node.js中使用createResolvers钩子,重写markdownRemark查询字段的解析逻辑,并显式标记返回类型为非空:
exports.createResolvers = ({ createResolvers }) => { const resolvers = { Query: { markdownRemark: { resolve: async (source, args, context) => { const result = await context.nodeModel.findOne({ type: "MarkdownRemark", query: { filter: { id: { eq: args.id } } } }); // 实际场景中该字段不为空,若意外为空可抛出错误提示 if (!result) throw new Error("目标Markdown内容未找到"); return result; }, type: "MarkdownRemark!" } } }; createResolvers(resolvers); };
这种方式直接修改查询字段的类型定义,让GraphQL系统识别该字段不会返回空值。
方法二:自定义Schema覆盖默认Query类型
在createSchemaCustomization钩子中,重新定义Query类型里的markdownRemark字段,强制添加非空约束:
exports.createSchemaCustomization = ({ actions }) => { const { createTypes } = actions; const typeDefs = ` type Query { markdownRemark(id: String!, frontmatter: FrontmatterFilterInput!): MarkdownRemark! # 保留其他默认查询字段,避免覆盖后功能丢失 allMarkdownRemark( sort: [MarkdownRemarkSortInput!] filter: MarkdownRemarkFilterInput limit: Int skip: Int ): MarkdownRemarkConnection! } `; createTypes(typeDefs); };
注意要完整保留Query类型中其他需要的字段(比如allMarkdownRemark),仅修改目标字段的非空标记即可。
内容的提问来源于stack exchange,提问作者Shoh
相关产品推荐
相关产品推荐

