当前位置: 首页 > 工具软件 > nest-cli > 使用案例 >

nest学习:使用环境变量

虞承泽
2023-12-01

文章问题导向

如何使用环境变量?根据环境变量配置

如果你都有了答案,可以忽略本文章,或去nest学习导图寻找更多答案


环境变量

根据使用环境的不同而设置不一样的配置

为什么要使用环境变量?

1,保护隐私数据
2,根据环境动态配置,如开发环境和生产环境配置不同,需要区分配置

node对象

全局对象:process是node中的全局对象,无需引入即可使用
环境变量:process.env则是用于配置环境变量

设置环境变量

切换到当前项目目录,windows系统使用关键字set,mac系统使用export,不区分大小写

语法:
设置
set PORT=9092
set(关键字) PORT(环境变量名)=9092(环境变量值)

查看
set PORT

删除
set PORT=

获取环境变量

node中都是这样的获取方式,不管是express,koa,nest

process.env.PORT

import { NestFactory } from '@nestjs/core';
import { Logger } from '@nestjs/common';
import { AppModule } from './app.module';

const PORT = process.env.PORT || 8000;   获取环境变量

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  
  await app.listen(PORT, () => {
    Logger.log(
      `服务已经启动,接口请访问:http://wwww.localhost:${PORT}`,
    );
  });
}
bootstrap();

实际应用

逻辑

首先,在启动项目时,根据启动命令,设置开发环境 或 生产环境变量
然后,在文件中,读取环境变量,根据环境变量配置


第一步:安装

yarn add cross-env

cross-env的作用是兼容window系统和mac系统来设置环境变量


第二步:在package.json中配置

开发环境development
生产环境production

"scripts": {
    "start:dev": "cross-env NODE_ENV=development nest start --watch",
    "start:debug": "nest start --debug --watch",
    "start:prod": "cross-env NODE_ENV=production node dist/main",
  },

第三步:根据环境变量配置

场景:根据环境变量设置不一样的数据库

这里使用配置抽离的方式,不会请移步

app.module.ts

import * as path from 'path';
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { ConfigModule, ConfigService } from 'nestjs-config';

@Module({
  imports: [
    ConfigModule.load(path.resolve(__dirname, 'config', '**/!(*.d).{ts,js}')),  
	TypeOrmModule.forRootAsync({
      useFactory: (config: ConfigService) => config.get('database'), 
      inject: [ConfigService], 
    })
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

src -> config -> database.ts

这里可以使用两种方式:

  1. 写2种配置,根据环境变量使用
  2. 写1种配置,根据环境变量设置

写2种配置的方式,比较繁琐

import { join } from 'path';

const developmentConfig = {
  type: process.env.DB_TYPE,
  host: process.env.DB_HOST_DEV,
  port: process.env.DB_PORT,
  username: process.env.DB_USERNAME,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_DATABASE_DEV,
  entities: [join(__dirname, '../', '**/**.entity{.ts,.js}')], 
  synchronize: true, 
  timezone: '+08:00',
  cache: {
    duration: 60000,
  },
  extra: {
    poolMax: 32,
    poolMin: 16,
    queueTimeout: 60000,
    pollPingInterval: 60,
    pollTimeout: 60,
  },
};

const productionConfig = {
  mysql: {
    type: process.env.DB_TYPE,
    host: process.env.DB_HOST_PRO,
    port: process.env.DB_PORT,
    username: process.env.DB_USERNAME,
    password: process.env.DB_PASSWORD,
    database: process.env.DB_DATABASE_PRO,
    entities: [join(__dirname, '../', '**/**.entity{.ts,.js}')],
    synchronize: true,
    timezone: '+08:00',
    cache: {
      duration: 60000,
    },
    extra: {
      poolMax: 32,
      poolMin: 16,
      queueTimeout: 60000,
      pollPingInterval: 60,
      pollTimeout: 60,
    },
  },
};

根据环境变量,使用对应的配置
const config =
  process.env.NODE_ENV === 'production' ? productionConfig : developmentConfig;

export default config;

写1种配置的方式

import { join } from 'path';

const config = {
  type: process.env.DB_TYPE,
  host: process.env.DB_HOST,
  port: process.env.DB_PORT,
  username: process.env.DB_USERNAME,
  password: process.env.DB_PASSWORD,
  database:
    process.env.NODE_ENV === 'production'    判断是否是开发环境
      ? process.env.DB_DATABASE_PRO
      : process.env.DB_DATABASE_DEV,
  entities: [join(__dirname, '../', '**/**.entity{.ts,.js}')],
  synchronize: true,
  timezone: '+08:00',
  cache: {
    duration: 60000,
  },
  extra: {
    poolMax: 32,
    poolMin: 16,
    queueTimeout: 60000,
    pollPingInterval: 60, 
    pollTimeout: 60,
  },
};

export default config;

选择哪一种,根据你的业务或者喜欢,如果仅仅修改数据库,使用第二种即可


第四步:创建.env文件,配置环境变量信息

在根目录创建.env文件,nestjs-config会读取该文件的变量

作用:替代在命令行中的环境变量,如果.env和命令行中的环境变量有同名的,则优先使用命令行中

好处:不用频繁在命令行中设置,只需要设置敏感信息即可

根目录 -> .env

PORT=9092
PREFIX=api/v1

--------数据库---------
DB_TYPE=mysql
DB_PORT=3306
DB_USERNAME=root
DB_PASSWORD=123456    或者 密码可以在命令行中设置

本地
DB_HOST_DEV=localhost
DB_DATABASE_DEV=test

线上
DB_HOST_PRO='41.115.442.55'
DB_DATABASE_PRO=test2

问题:在main.ts中是无法读取.env文件的环境变量的,如果你需要在main.ts中读取.env的环境变量,需要安装一个库解决问题

yarn add dotenv

import { NestFactory } from '@nestjs/core';
import { Logger } from '@nestjs/common';
import { AppModule } from './app.module';

引入使用
import * as dotenv from 'dotenv';
dotenv.config();

const PORT = process.env.PORT || 8000;     读取.env文件的PORT,如果没有就设置为8000
const PREFIX = process.env.PREFIX || '/';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  
  await app.listen(PORT, () => {
    Logger.log(
      `服务已经启动,接口请访问:http://wwww.localhost:${PORT}`,
    );
   Logger.log(
      `服务已经启动,接口请访问:http://wwww.localhost:${PORT}/${PREFIX}`,
    );
  });
}
bootstrap();

学习更多

nest学习导图

 类似资料: