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

Nest.js + TypeORM迁移时无法读取.env文件问题求助

解决TypeORM迁移时无法读取.env配置的问题

核心原因

TypeORM迁移命令直接执行data-source.ts,而你在App.module.ts中配置的ConfigModule仅在NestJS应用启动时加载.env文件,迁移流程不会触发NestJS模块初始化,导致process.env无法获取.env中的变量。

解决方案

方案1:在data-source.ts中手动加载.env文件

直接在data-source.ts顶部用dotenv包加载.env文件,确保迁移执行前变量已注入:

  1. 安装依赖(未安装时执行):
npm install dotenv --save-dev
  1. 修改data-source.ts:
import 'dotenv/config';
import { DataSource, DataSourceOptions } from 'typeorm';

const dataSourceOptions: DataSourceOptions = {
  type: 'postgres',
  host: process.env.DB_HOST,
  port: parseInt(process.env.DB_PORT),
  username: process.env.DB_USERNAME,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_DATABASE,
  entities: ['dist/**/*.entity.js'],
  migrations: ['dist/migrations/*.js'],
};

export const AppDataSource = new DataSource(dataSourceOptions);

若需按NODE_ENV加载不同.env文件(如.env.development、.env.production),可调整为:

import * as dotenv from 'dotenv';
import * as path from 'path';

const envPath = path.resolve(process.cwd(), `.env.${process.env.NODE_ENV || 'development'}`);
dotenv.config({ path: envPath });

// 后续DataSource配置不变

方案2:修改package.json迁移脚本,前置加载.env

无需修改data-source.ts,在迁移命令前通过工具加载.env:

  1. 安装依赖:
npm install cross-env dotenv-cli --save-dev
  1. 更新package.json脚本:
{
  "scripts": {
    "migrate:run": "cross-env NODE_ENV=development dotenv-cli -- ts-node ./node_modules/typeorm/cli.js migration:run -d ./src/data-source.ts",
    "migrate:generate": "cross-env NODE_ENV=development dotenv-cli -- ts-node ./node_modules/typeorm/cli.js migration:generate ./src/migrations/[MigrationName] -d ./src/data-source.ts"
  }
}

根据环境需求调整NODE_ENV值即可。

方案3:通过NestJS上下文加载ConfigModule

利用NestJS的上下文机制,让迁移命令通过应用启动流程加载ConfigModule:

  1. 确保AppModule中正确配置:
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';

@Module({
  imports: [
    ConfigModule.forRoot({
      envFilePath: `.env.${process.env.NODE_ENV || 'development'}`,
      isGlobal: true,
    }),
    TypeOrmModule.forRootAsync({
      useFactory: () => ({
        type: 'postgres',
        host: process.env.DB_HOST,
        port: parseInt(process.env.DB_PORT),
        username: process.env.DB_USERNAME,
        password: process.env.DB_PASSWORD,
        database: process.env.DB_DATABASE,
        entities: ['dist/**/*.entity.js'],
        migrations: ['dist/migrations/*.js'],
      }),
    }),
  ],
})
export class AppModule {}
  1. 创建自定义迁移脚本migrate.ts:
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { DataSource } from 'typeorm';

async function bootstrap() {
  const app = await NestFactory.createApplicationContext(AppModule);
  const dataSource = app.get(DataSource);
  
  const command = process.argv[2];
  switch(command) {
    case 'run':
      await dataSource.runMigrations();
      break;
    case 'generate':
      const migrationName = process.argv[3];
      await dataSource.createMigration(migrationName);
      break;
    case 'revert':
      await dataSource.undoLastMigration();
      break;
    default:
      console.log('未知命令,请使用 run/generate/revert');
  }
  
  await app.close();
}

bootstrap();
  1. 添加package.json脚本:
{
  "scripts": {
    "migrate:run": "cross-env NODE_ENV=development ts-node ./src/migrate.ts run",
    "migrate:generate": "cross-env NODE_ENV=development ts-node ./src/migrate.ts generate [MigrationName]",
    "migrate:revert": "cross-env NODE_ENV=development ts-node ./src/migrate.ts revert"
  }
}

验证方式

执行迁移命令后,检查是否能正常连接数据库并完成迁移。若之前替换字符串值可正常运行,说明数据库参数无误,只需确认.env变量已正确加载即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 19:35:25