一、环境变量
1、使用dotenv
-
安装
pnpm add dotenv
。 -
根目录下创建
.env
文件,内容如下:
NODE_ENV=development
- 使用
import {config} from "dotenv";
const path = require('path');
config({path:path.join(__dirname,'../.env')});
console.log(process.env.NODE_ENV);//读取
2、使用corss-env
-
全局安装
cross-env
,执行:pnpm add cross-env -g
-
调整
package.json
中的script
配置:
"scripts": {"start:dev": "cross-env APIHOST=itfeiniu.com nest start --watch",...},
- 如何使用:
process.env.APIHOST
以上两种环境变量的方式,可以同时存在。
3、系统自带环境变量
nestjs
对process.env
做了初始化,把package.json
中的配置全部都赋值给了process.env
。展示其中一部分如下图:
二、系统配置
nestjs
中可以使用ConfigModule
来开启配置功能。
1、实例化引用配置
-
创建
/config/env.dev
、/config/env.test
配置文件#/config/env.dev test配置文件结构一致 CONFIG_VERSION=devMYSQL_HOST=123.00.00.00 MYSQL_PORT=3006 MYSQL_DATABASE=sc-lowcode MYSQL_USER=root MYSQL_PASSWORD=111111
-
app.modules.ts
配置import { ConfigModule } from '@nestjs/config';const getEnvFileName = () => {const RUNNING_ENV = process.env.RUNNING_ENV;console.log('RUNNING_ENV: ', RUNNING_ENV);return path.join(process.cwd(), `./config/env.${RUNNING_ENV}`); };@Module({imports: [...ConfigModule.forRoot({isGlobal: true,envFilePath: `${getEnvFileName()}`,}), })
-
package.json
代码:"scripts": {"start:dev": "cross-env RUNNING_ENV=dev NODE_ENV=production node dist/main",...},
-
app.controller.ts
调用@Controller() export class AppController {constructor(private readonly configService: ConfigService) {}@Get()getHello(): string {console.log(this.configService.get('MYSQL_PORT')); // 3006console.log(this.configService.get('MYSQL_DATABASE')); // sc-lowcodeconsole.log(this.configService.get('key', 'defaultValue')); // defaultValue} }
简单来说就是
app.modules.ts
中全局引入ConfigModule
之后,所有的子模块的控制器中都可以通过构造函数声明,自动实例化configService
,然后控制器中可以使用this.configService.get(配置项)
获取配置。
2、缓存在全局变量
/config/env.dev
、/config/env.test
、app.modules.ts
、package.json
文件的配置和上述一致,不同的是在main.ts
和app.controller.ts
中的调用。
-
main.ts
缓存import { ConfigService } from '@nestjs/config'; import { globalConfigService } from './utils/env'; async function bootstrap() {...// 暂存配置globalConfigService.configService = app.get(ConfigService);... }
-
/utils/env.ts
代码import { ConfigService } from '@nestjs/config';export const globalConfigService: {configService: ConfigService | undefined; } = {configService: undefined, };
app.controller.ts
调用 -
globalConfigService.configService.get('OSS_ACCESS_KEY_ID')
不用的import对象,可以使用
shift+alt+o
自动整理清除。