NestJS运行TypeORM迁移时报Cannot use import statement outside a module错误如何解决
错误原因分析
- 你的TypeORM配置中
migrations字段指向的是src目录下的.ts原始TypeScript文件,Node.js运行时默认无法直接解析TS文件的ESM导入语法,直接执行就会抛出该导入语法错误。 - 你直接使用TypeORM自带CLI执行迁移命令时,CLI不会自动编译TS代码为可执行的JS代码,因此直接加载TS文件就触发了报错。
解决方案
你可以选择任意一种符合你开发习惯的方案修复:
方案1:使用ts-node运行迁移命令(开发阶段推荐)
- 先安装ts-node开发依赖:
npm install ts-node --save-dev
- 修改package.json中的迁移相关脚本,用ts-node调用TypeORM CLI:
{ "scripts": { "migration:show": "ts-node ./node_modules/typeorm/cli.js migration:show", "migration:run": "ts-node ./node_modules/typeorm/cli.js migration:run", "migration:revert": "ts-node ./node_modules/typeorm/cli.js migration:revert" } }
如果使用的是TypeORM 0.3.x版本,调整上述脚本中cli的入口路径即可。
方案2:指向编译后的JS文件(生产阶段推荐)
- 修改TypeORM配置中的migrations字段,指向dist目录下编译后的JS文件:
migrations: [ join(__dirname, 'migrations/*{.js}') ]
- 每次执行迁移命令前,先运行
npm run build将TS代码全量编译到dist目录,再执行迁移命令即可。
注意:你当前配置中
synchronize: true在生产环境必须关闭,否则会自动同步实体结构覆盖数据库数据,引发数据丢失风险。
内容的提问来源于stack exchange,提问作者grisha_yepiskoposyan
相关产品推荐
相关产品推荐

