前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Dotenv在nestjs中的使用

Dotenv在nestjs中的使用

原创
作者头像
挥刀北上
发布2021-12-20 00:41:47
16.8K1
发布2021-12-20 00:41:47
举报
文章被收录于专栏:Node.js开发Node.js开发

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读取相关的配置变量。

  1. 首先安装对应npm包
  2. 配置环境变量文件
  3. 定义读取环境变量的函数
  4. 配置@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的方法,希望对你有所帮助。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档