文章问题导向
如何使用环境变量?根据环境变量配置
如果你都有了答案,可以忽略本文章,或去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
这里可以使用两种方式:
写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();
学习更多