Apollo Server报错:Query.totalPosts在resolvers定义但未在schema声明
问题原因
抛出Error: Query.totalPosts defined in resolvers, but not in schema的核心原因是Apollo Server启动时会做一致性校验:所有resolver中定义的字段,必须在加载合并后的GraphQL Schema(即typeDefs)中存在对应声明。你当前代码中resolver的Query下定义了totalPosts、me两个字段,但合并得到的typeDefs里没有这两个字段的声明,校验不通过直接抛错。
修复步骤
- 检查
./typeDefs目录下的类型定义,确认Query类型声明了和resolver对应的字段,正确的字段声明示例:
type Query { totalPosts: Int! me: String! }
如果你的typeDefs拆分在多个文件中,非根文件的Query定义必须用extend type Query,否则合并时会出现类型覆盖,最终生成的Schema缺字段。
- 检查
fileLoader的加载配置,默认配置下fileLoader只会识别.graphql后缀文件,如果你的类型定义写在.js文件里,必须显式指定加载规则,否则会加载到空的typeDefs,自然匹配不到resolver字段:
// 修正typeDefs加载逻辑 const typeDefs = mergeTypes(fileLoader(path.join(__dirname, './typeDefs'), { extensions: ['.js', '.graphql'], recursive: true }));
- 删除代码中重复的
applyMiddleware调用,你连续两次调用该方法,第二次未指定path参数会导致路由重复挂载,属于冗余代码,保留带path参数的那行即可。
临时规避方案(仅本地调试用,禁止生产环境使用)
如果你需要临时跳过校验跑通流程,可以在初始化Apollo Server时关闭校验规则,但这只是绕过报错,后续必须对齐Schema和resolver的字段定义:
const apolloServer = new ApolloServer({ typeDefs, resolvers, // 跳过字段一致性校验 validationRules: () => [] });
常见触发场景提示:这类报错90%以上由三类问题导致:typeDefs文件加载失败、字段名拼写/大小写不匹配、多文件合并typeDefs时未用
extend关键字导致类型覆盖,优先排查这三点可以快速定位问题。
内容的提问来源于stack exchange,提问作者Gaia
相关产品推荐
相关产品推荐

