执行typeorm migration:generate报错:无法打开文件及模块外import问题
问题描述
执行TypeORM迁移生成命令时出现错误:
typeorm migration:generate InitialSetup -d ormconfig.ts
错误信息:
Error: Unable to open file: "C:\_work\template-db\ormconfig.ts". Cannot use import statement outside a module at CommandUtils.loadDataSource (C:\_work\template-db\node_modules\typeorm\commands\CommandUtils.js:22:19) at async Object.handler (C:\_work\template-db\node_modules\typeorm\commands\MigrationGenerateCommand.js:68:26)
ormconfig.ts内容:
import { DataSource } from "typeorm"; import ApplicationConstants from "@config/application-constants"; import path from "path"; export const dataSource = new DataSource({ type: "postgres", host: ApplicationConstants.DatabaseHost, port: ApplicationConstants.DatabasePort, username: ApplicationConstants.DatabaseUsername, password: ApplicationConstants.DatabasePassword, database: ApplicationConstants.DatabaseName, synchronize: false, logging: false, migrationsRun: false, migrations: [path.join(__dirname, "migrations/**/*{.js,.ts}")], entities: [path.join(__dirname, "entity/**/*{.js,.ts}")], });
版本信息:
- Node: 18.12.1
- TypeORM: 0.3.10
问题原因
Node.js默认将.ts文件识别为CommonJS模块,而你的ormconfig.ts使用了ES模块的import语法,导致Node无法正确解析,抛出"Cannot use import statement outside a module"错误。
解决方法
以下几种方案任选其一:
方案1:用ts-node直接运行命令
修改命令,通过ts-node来解析TypeScript配置文件:
npx ts-node ./node_modules/typeorm/cli.js migration:generate InitialSetup -d ormconfig.ts
方案2:配置package.json为ES模块
在项目根目录的package.json中添加"type": "module":
{ "type": "module" }
同时确保TypeScript配置文件tsconfig.json设置对应模块选项:
{ "compilerOptions": { "module": "ESNext", "moduleResolution": "NodeNext" } }
之后直接运行原命令即可。
方案3:将配置文件转为CommonJS格式
把ormconfig.ts中的import改为require,并导出为CommonJS格式:
const { DataSource } = require("typeorm"); const ApplicationConstants = require("@config/application-constants"); const path = require("path"); module.exports = new DataSource({ type: "postgres", host: ApplicationConstants.DatabaseHost, port: ApplicationConstants.DatabasePort, username: ApplicationConstants.DatabaseUsername, password: ApplicationConstants.DatabasePassword, database: ApplicationConstants.DatabaseName, synchronize: false, logging: false, migrationsRun: false, migrations: [path.join(__dirname, "migrations/**/*{.js,.ts}")], entities: [path.join(__dirname, "entity/**/*{.js,.ts}")], });
之后运行原命令即可。
内容的提问来源于stack exchange,提问作者chraebsli
相关产品推荐
相关产品推荐

