运行node dist/index.js时报src目录TS文件import语法错误如何解决
问题原因
你的TypeORM、TypeGraphQL配置中,实体(Entities)、解析器(Resolvers)的扫描路径写死了src目录下的.ts文件。当你执行node dist/index.js启动编译后的代码时,运行时会按照配置去读取src目录下的TS源文件,Node本身不支持直接执行TS文件的ESM import语法,就会抛出你遇到的语法错误。
你删除src文件夹后,程序找不到src下的目标文件,会自动匹配到dist目录下编译完成的CommonJS规范的.js文件,因此可以正常启动。
解决方案
1. 修改实体/解析器扫描路径
把你TypeORM配置(代码内配置或ormconfig.json)、TypeGraphQL的buildSchema配置中的路径,改为适配开发+生产环境的写法,示例:
// TypeORM 配置示例 entities: [ // 开发环境读取src下的TS文件 process.env.NODE_ENV === 'development' ? 'src/entities/**/*.ts' : '', // 生产环境读取dist下的JS文件 'dist/entities/**/*.js' ].filter(Boolean) // TypeGraphQL buildSchema 配置示例 const schema = await buildSchema({ resolvers: [ process.env.NODE_ENV === 'development' ? 'src/resolvers/**/*.ts' : '', 'dist/resolvers/**/*.js' ].filter(Boolean), // 其余配置保持不变 })
如果是用ormconfig.json的静态配置,可以直接写两个路径,程序会自动忽略不存在的路径:
{ "entities": ["src/entities/**/*.ts", "dist/entities/**/*.js"] }
2. 优化构建流程(可选)
可以在package.json的build脚本中加入清空旧dist目录的逻辑,避免旧编译文件干扰:
首先安装跨平台删除工具rimraf:
npm install rimraf --save-dev
修改脚本:
{ "scripts": { "build": "rimraf dist && tsc -p ." } }
3. 确认启动时的环境变量
启动生产服务时可以明确指定NODE_ENV为production,避免加载开发环境的配置:
{ "scripts": { "start": "NODE_ENV=production node dist/index.js" } }
Windows环境如果不支持直接设置环境变量,可以安装cross-env工具:
npm install cross-env --save-dev
修改为:
{ "scripts": { "start": "cross-env NODE_ENV=production node dist/index.js" } }
内容的提问来源于stack exchange,提问作者Adham
相关产品推荐
相关产品推荐

