graphql-yoga执行posts查询返回Unexpected error如何解决?
问题定位
核心问题是createServer配置项位置写错:context是createServer的顶层配置,不属于schema配置对象的内部属性。
你当前代码把context: { db }写在了schema对象内部,框架不会读取这个位置的context配置,所有resolver的第三个参数拿不到你注入的db对象。执行posts查询时,Query.posts resolver里执行const { db } = context本质是对undefined解构,直接抛出JS运行错误。graphql-yoga默认关闭错误详情输出,只会返回通用的Unexpected error,控制台也不会打印具体错误栈,所以看起来毫无头绪。
修复代码
修改index.js的服务配置,把context移到和schema平级的位置:
import { createServer } from "@graphql-yoga/node"; import { readFileSync } from "node:fs"; import Comment from "./resolvers/Comment"; import Query from "./resolvers/Query"; import Post from "./resolvers/Post"; import User from "./resolvers/User"; import Mutation from "./resolvers/Mutation"; import db from "./db"; const typeDefs = readFileSync("./src/schema.graphql", "utf-8"); const server = createServer({ schema: { typeDefs, resolvers: { Query, Mutation, Post, User, Comment }, }, // context移到顶层,和schema同级 context: { db }, }); server.start();
改完重启服务,再执行posts查询就能正常返回数据。
后续排查指引(如果改完仍报错)
如果调整配置后问题依旧,按以下步骤排查:
- 开启调试日志打印真实错误:在createServer配置中加入
logging: 'debug',重启服务后控制台会输出完整错误栈,直接定位具体问题,不用靠猜const server = createServer({ logging: 'debug', schema: { typeDefs, resolvers: { Query, Mutation, Post, User, Comment }, }, context: { db }, }); - 检查db.js导出逻辑:你贴的代码只给出了posts数组的定义,要确认db文件最终导出的对象包含
posts、users、comments三个数组,不要漏导出或者导出结构不对 - 检查resolver文件导入路径:确认
./resolvers/Query、./resolvers/Post等导入路径和本地文件实际路径完全匹配,路径错误会导致导入的resolver值为undefined,查询时直接报错。
内容的提问来源于stack exchange,提问作者user19180062
相关产品推荐
相关产品推荐

