You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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代码并自动解析包路径:

  1. 安装依赖:
npm install ts-node tsconfig-paths --save-dev
  1. 修改graphql-server的dev脚本:
"dev": "ts-node -r tsconfig-paths/register src/index.ts"

注意:生产环境仍需使用编译后的JS文件。

内容的提问来源于stack exchange,提问作者Aeseir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 20:12:12