Turborepo中Prisma集成Apollo GraphQL Server启动报错求助
排查Apollo GraphQL服务器启动时的
ERR_UNKNOWN_FILE_EXTENSION错误 错误根源
报错显示Node.js无法识别.ts扩展名,说明你的GraphQL服务器在启动时直接尝试加载packages/database/src/index.ts这个未编译的TypeScript文件——而Node.js默认只能执行JavaScript文件。问题出在包依赖的入口配置错误,导致编译后的GraphQL服务器代码仍然指向database包的TS源码,而非编译后的JS产物。
解决方案
1. 修正packages/database的package.json配置
确保database包的入口字段指向编译后的产物,而非源码:
{ "name": "@your-org/database", // 替换为你的实际包名 "main": "./dist/index.js", "module": "./dist/index.mjs", // 可选,适配ES模块规范 "types": "./dist/index.d.ts", // TypeScript类型定义入口 "scripts": { "build": "tsc", "dev": "tsc --watch" // 开发时自动监听源码变化并编译 } }
同时检查packages/database/tsconfig.json,确保输出目录配置正确:
{ "compilerOptions": { "outDir": "./dist", "rootDir": "./src", "module": "CommonJS", // 或ESNext,根据项目模块规范调整 "target": "ES2020", "declaration": true // 自动生成类型定义文件 } }
2. 配置TurboRepo任务依赖
在项目根目录的turbo.json中,让graphql-server的dev任务依赖database包的构建任务,确保启动前先完成database的编译:
{ "pipeline": { "build": { "dependsOn": ["^build"] }, "dev": { "cache": false, "dependsOn": ["^dev"] } } }
3. 检查GraphQL服务器的导入路径
确保服务器代码中导入database包时使用包名,而非直接指向源码的相对路径:
// 正确写法 import { prisma } from '@your-org/database'; // 错误写法(会直接加载未编译的TS源码) import { prisma } from '../../packages/database/src/index.ts';
4. 重新执行构建与启动
先手动编译database包确保产物存在:
cd packages/database && npm run build
再用Turbo启动所有服务:
turbo run dev
额外优化(开发阶段)
如果想在开发时避免重复手动编译,可以给graphql-server配置ts-node支持,直接运行TS代码并自动解析包路径:
- 安装依赖:
npm install ts-node tsconfig-paths --save-dev
- 修改
graphql-server的dev脚本:
"dev": "ts-node -r tsconfig-paths/register src/index.ts"
注意:生产环境仍需使用编译后的JS文件。
内容的提问来源于stack exchange,提问作者Aeseir
相关产品推荐
相关产品推荐

