NestJS数据库模块无法读取.env配置参数问题求助
NestJS数据库模块无法读取.env参数的解决方法
问题场景
尝试在NestJS中创建独立的数据库连接模块,但模块无法读取同目录下.env文件中的配置参数。
现有代码
database.module.ts(路径:src/infrastructure/database/database.module.ts)
import {Module} from "@nestjs/common"; import { ConfigModule } from "@nestjs/config"; import { TypeOrmModule } from "@nestjs/typeorm"; @Module({ imports: [ ConfigModule.forRoot({ envFilePath:".env", isGlobal:true}), TypeOrmModule.forRoot({ type:'mysql', host:process.env.DATABASE_HOST, port:parseInt(process.env.DATABASE_PORT), username:process.env.DATABASE_USER, password:process.env.DATABASE_PASSWORD, database:process.env.DATABASE, synchronize:true, entities:[__dirname+"../../domain/entities/*.entity{.ts,.js}"] }), ], exports: [TypeOrmModule] }) export class DatabaseModule{}
app.module.ts
import { Module } from '@nestjs/common'; import { DatabaseModule } from './infrastructure/database/database.module'; import { UserModule } from './infrastructure/modules/user.module'; @Module({ imports: [ DatabaseModule, UserModule ], controllers: [], providers: [ DatabaseModule, ], exports:[] }) export class AppModule {}
解决步骤
1. 修正.env文件路径
当前envFilePath: ".env"会指向项目根目录的.env文件,而非database模块同目录的.env。通过__dirname拼接绝对路径,确保加载正确的文件:
// 先导入path模块 import * as path from 'path'; // 修改ConfigModule配置 ConfigModule.forRoot({ envFilePath: path.join(__dirname, '.env'), // 指向当前模块目录下的.env isGlobal: true }),
2. 使用异步加载方式读取配置
直接在TypeOrmModule.forRoot中使用process.env可能因ConfigModule加载时机问题导致读取失败,改用forRootAsync结合ConfigService更可靠:
// 修改TypeOrmModule的配置部分 TypeOrmModule.forRootAsync({ useFactory: (configService: ConfigService) => ({ type: 'mysql', host: configService.get<string>('DATABASE_HOST'), port: configService.get<number>('DATABASE_PORT'), username: configService.get<string>('DATABASE_USER'), password: configService.get<string>('DATABASE_PASSWORD'), database: configService.get<string>('DATABASE'), synchronize: true, entities: [path.join(__dirname, '../../domain/entities/*.entity{.ts,.js}')] }), inject: [ConfigService], }),
3. 移除AppModule中错误的配置
DatabaseModule是模块,不需要放到providers数组中,只保留在imports即可:
@Module({ imports: [ DatabaseModule, UserModule ], controllers: [], providers: [], // 移除DatabaseModule exports:[] }) export class AppModule {}
完整修正后的database.module.ts
import {Module} from "@nestjs/common"; import { ConfigModule, ConfigService } from "@nestjs/config"; import { TypeOrmModule } from "@nestjs/typeorm"; import * as path from 'path'; @Module({ imports: [ ConfigModule.forRoot({ envFilePath: path.join(__dirname, '.env'), isGlobal: true }), TypeOrmModule.forRootAsync({ useFactory: (configService: ConfigService) => ({ type: 'mysql', host: configService.get<string>('DATABASE_HOST'), port: configService.get<number>('DATABASE_PORT'), username: configService.get<string>('DATABASE_USER'), password: configService.get<string>('DATABASE_PASSWORD'), database: configService.get<string>('DATABASE'), synchronize: true, entities: [path.join(__dirname, '../../domain/entities/*.entity{.ts,.js}')] }), inject: [ConfigService], }), ], exports: [TypeOrmModule] }) export class DatabaseModule{}
内容的提问来源于stack exchange,提问作者k1k4ss0
相关产品推荐
相关产品推荐

