GraphQL Yoga 必须加 --inspect 才能调试,VS Code 需用 attach 模式连接对应端口,并配置正确 outFiles 和 graphql.config.yml 以支持断点与类型提示。

GraphQL Yoga 启动时必须加 --inspect 才能连上 VS Code 断点
VS Code 调试器默认不主动监听 Node 进程,graphql-yoga 启动后若没显式开启 inspector,断点会完全失效——点击行号左侧出现空心圆,F5 运行直接跳过。
正确做法是:启动服务时加上 --inspect 或 --inspect-brk 标志:
-
npx graphql-yoga --inspect(监听默认 9229 端口) -
npx graphql-yoga --inspect=0.0.0.0:9230(指定端口,适合 Docker 或远程调试) -
npx graphql-yoga --inspect-brk(启动即暂停,方便在入口逻辑设断点)
注意:graphql-yoga@v5+ 默认使用 ESM,若项目是 CommonJS,需额外加 --loader ts-node/esm 或改用 ts-node 启动,否则 --inspect 可能被忽略。
launch.json 配置要匹配 Yoga 的实际启动方式
不能直接套用 Express 或纯 node app.js 的配置。Yoga 是 CLI 工具,不是普通 JS 入口文件,所以 "program" 字段通常不适用;应优先用 "request": "attach" 模式。
推荐的 .vscode/launch.json 片段:
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "attach",
"name": "Attach to Yoga",
"port": 9229,
"address": "localhost",
"restart": true,
"skipFiles": ["<node_internals>/**"],
"outFiles": ["${workspaceFolder}/dist/**/*.js"]
}
]
}
关键点:
-
"request": "attach"是必须的,Yoga 不支持launch模式直接启动 -
"port"必须和--inspect指定的端口一致(默认 9229) -
"outFiles"若用了 TypeScript 编译,需指向dist目录,否则断点映射失败 -
"restart": true可让服务热重启后自动重连调试器
类型安全检测依赖 graphql-config.yml + schema.graphql 本地文件
VS Code 插件(如 GraphQL for VSCode)对 Yoga 的类型提示和字段校验,几乎完全依赖本地 schema 文件。直连 http://localhost:4000/graphql 容易因 CORS、鉴权或 introspection 关闭而静默失败,且不触发错误提示。
实操步骤:
- 启动 Yoga 服务后,用
curl http://localhost:4000/graphql?introspection=true > schema.graphql导出 SDL 格式 schema(确保服务启用了 introspection) - 在项目根目录创建
graphql.config.yml,内容为:
schema: ./schema.graphql documents: './src/**/*.graphql'
注意:
- 路径必须是相对
graphql.config.yml的,写成./src/schema.graphql会找不到 - Windows 用户避免反斜杠:
schema: "schema\schema.graphql"无效,得写schema: "schema/schema.graphql" - 如果导出的是 JSON introspection 结果,文件名必须是
schema.json,且配置中明确写schema: ./schema.json
Resolver 函数里断点不生效?检查是否在 src/ 外定义了 schema
Yoga 支持多种 schema 定义方式:内联字符串、.graphql 文件、buildSchema 调用等。但 VS Code 断点只对实际执行的 JS/TS 源码有效——如果 resolver 逻辑写在 node_modules 或生成代码里(比如 graphql-codegen 输出的 resolvers.ts),断点可能无法命中。
常见陷阱:
- 用
gql`...`写 schema 字符串 → 断点只能打在 resolver 函数里,不能打在 schema 字符串上 - schema 来自
fs.readFileSync('./schema.graphql')→ 断点打在读取逻辑没问题,但 resolver 本身若在别处定义,需确认 source map 是否启用 - 用了
graphql-codegen生成 resolvers → 确保tsconfig.json中"sourceMap": true,且launch.json的"outFiles"包含生成目录(如./generated/**.js)
最稳的做法:把 resolver 实现写在 src/resolvers.ts 中,保持与 schema 定义分离,并确保该文件被 TypeScript 编译且 source map 正确生成。


















