Dotenv 是一个零依赖的模块,它能将环境变量中的变量从 .env 文件加载到 process.env 中。
使用 在项目中安装 dotenv
代码语言:javascript复制npm install dotenv -S
根目录下创建 .env 文件
代码语言:javascript复制HOST=localhost
PORT=3000
MONGOOSE_URL=mongodb://localhost:27017/test
根目录下 app.js 下引入 dotenv 并使用
代码语言:javascript复制require('dotenv').config({ path: '.env' })
// 使用
console.log(process.env.HOST) // localhost
console.log(process.env.PORT) // 3000
console.log(process.env.MONGOOSE_URL) // mongodb://localhost:27017/test
如何在nestjs中使用dotenv呢?
在nestjs中使用环境变量, 推荐使用官方提供的@nestjs/config,开箱即用:
@nestjs/config依赖于dotenv,可以通过key=value形式配置环境变量,项目会默认加载根目录下的.env文件,我们只需在app.module.ts中引入ConfigModule,使用ConfigModule.forRoot()方法即可,然后ConfigService读取相关的配置变量。
- 首先安装对应npm包
- 配置环境变量文件
- 定义读取环境变量的函数
- 配置@nestjs/config的方法
首先安装@nestjs/config
配置环境变量文件,配置两个文件,一个用于开发环境,一个用于生产环境.en文件,.en.prod文件
代码语言:javascript复制// 数据库地址
DB_HOST=localhost
// 数据库端口
DB_PORT=3306
// 数据库登录名
DB_USER=root
// 数据库登录密码
DB_PASSWD=root
// 数据库名字
DB_DATABASE=blog
.env.prod中的是上线要用的数据库信息,如果你的项目要上传到线上管理,为了安全性考虑,建议这个文件添加到.gitignore中。接着在根目录下创建一个文件夹config(与src同级),然后再创建一个env.ts用于根据不同环境读取相应的配置文件。
这个文件的作用是判断当前环境是开发环境还是测试环境:
代码语言:javascript复制import * as fs from 'fs';
import * as path from 'path';
const isProd = process.env.NODE_ENV === 'production';
function parseEnv() {
const localEnv = path.resolve('.env');
const prodEnv = path.resolve('.env.prod');
if (!fs.existsSync(localEnv) && !fs.existsSync(prodEnv)) {
throw new Error('缺少环境配置文件');
}
const filePath = isProd && fs.existsSync(prodEnv) ? prodEnv : localEnv;
return { path:filePath };
}
export default parseEnv();
上面的文件执行返回的是一个对象:
代码语言:javascript复制{path:'环境变量文件'}
然后配置@nestjs/config的方法
代码语言:javascript复制import { TypeOrmModule } from '@nestjs/typeorm';
import { ConfigService, ConfigModule } from '@nestjs/config';
import envConfig from '../config/env';
@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true, // 设置为全局
envFilePath: [envConfig.path]
}),
TypeOrmModule.forRootAsync({
imports: [ConfigModule],
inject: [ConfigService],
useFactory: async (configService: ConfigService) => ({
type: 'mysql', // 数据库类型
entities: [], // 数据表实体
host: configService.get('DB_HOST', 'localhost'), // 主机,默认为localhost
port: configService.get<number>('DB_PORT', 3306), // 端口号
username: configService.get('DB_USER', 'root'), // 用户名
password: configService.get('DB_PASSWORD', 'root'), // 密码
database: configService.get('DB_DATABASE', 'blog'), //数据库名
timezone: ' 08:00', //服务器上配置的时区
synchronize: true, //根据实体自动创建数据库表, 生产环境建议关闭
}),
}),
PostsModule,
],
...
})
export class AppModule {}
ConfigModule的forRoot函数参数是一个对象,比较重要的属性是isGlobal和envFilePath,这个envFilePath就是根据环境变量读取的环境变量配置文件。
那么如何读取process.env呢?直接调用configService的get方法,get方法第一个参数是环境变量属性,第二个参数为默认值。
以上便是在nestjs中使用dotenv的方法,希望对你有所帮助。