配置NestJS+TypeORM CLI时环境特定文件无法读取的原因
问题原因分析
- 迁移脚本未传递NODE_ENV:执行TypeORM迁移命令时,
package.json中的迁移相关脚本没有设置NODE_ENV环境变量,导致typeOrm.config.ts里的process.env.NODE_ENV返回undefined,无法正确加载.env.development文件。 - 容器环境变量作用范围有限:
docker-compose.development.yml中给nest-api服务配置的env_file仅对容器启动时的start:dev命令生效,单独执行迁移命令时不会自动继承这些环境变量。
解决方案
方案一:修改package.json脚本,显式传递NODE_ENV
更新package.json中的TypeORM相关脚本,明确指定NODE_ENV:
"scripts": { "start:dev": "NODE_ENV=development nest start --watch", "start:debug": "NODE_ENV=development nest start --debug --watch", "start:prod": "NODE_ENV=production node dist/main", "typeorm:dev": "NODE_ENV=development ts-node ./node_modules/typeorm/cli", "typeorm:run-migrations:dev": "npm run typeorm:dev migration:run -- -d ./src/config/typeOrm.config.ts", "typeorm:generate-migration:dev": "npm run typeorm:dev -- -d ./src/config/typeOrm.config.ts migration:generate ./src/migrations/$npm_config_name", "typeorm:create-migration": "npm run typeorm:dev -- migration:create ./src/migrations/$npm_config_name" }
之后执行迁移时使用npm run typeorm:run-migrations:dev即可。
方案二:在Docker容器内执行迁移
如果需要在容器内运行迁移命令,可按以下步骤操作:
- 启动容器(确保数据库服务正常运行):
docker-compose -f docker-compose.development.yml up -d
- 进入
nest-api容器并执行迁移,同时传递NODE_ENV:
docker exec -e NODE_ENV=development clean-architecture-api npm run typeorm:run-migrations
或者直接修改docker-compose.development.yml,给nest-api服务添加固定环境变量:
services: nest-api: # 其他配置保持不变 environment: - NODE_ENV=development
这样容器内执行任何命令时都会自动带上NODE_ENV=development。
额外注意事项
.env.development中的POSTGRES_HOST需要改为db(对应docker-compose中数据库服务的名称),容器内无法通过localhost访问数据库服务。typeOrm.config.ts的entities数组需补充实体路径,否则迁移无法识别实体:
entities: ['src/**/*.entity.ts'], // 生产环境可改为 // entities: ['dist/**/*.entity.js'],
内容的提问来源于stack exchange,提问作者rshehi
相关产品推荐
相关产品推荐

