nest.js中不同环境的配置读取
node中不同环境的配置读取
在node中最常用的是.env
格式的配置文件,他有一个专门的npm包 dotenv
:
我们来创建一个node项目试一下:
进入这个目录,安装dotenv
:
npm install dotenv
然后新建一个.env
配置文件:
aaa=1
bbb=2
新建index.js并写入如下内容:
require('dotenv').config({
path: './.env',
})
console.log(process.env)
node执行一下:
node index.js
打印的环境变量中就包含了.env
中的内容
那如果还有生产环境的配置文件呢
比如.production.env
:
a=111
b=222
我们可以通过NODE_ENVIRONMENT
环境变量来切换:
require('dotenv').config({
path: process.env.NODE_ENVIRONMENT === 'production' ? '.production.env' : '.env',
})
console.log('aaa', process.env.aaa);
console.log('bbb', process.env.bbb)
nest.js中读取不同环境配置
nest中提供了完整的解决方案:@nestjs/config
我们创建个nest项目来试一下:
nest new nest-config-test -p npm
安装一下@nestjs/config
包:
npm install --save @nestjs/config
这个包同样是动态模块的方式,他有forRoot和fotFeature两个方法
我们在根目录加一个配置文件.env
:
aaa=1
bbb=2
然后在AppModule里面引入:
然后再AppController里注入ConfigService来读取配置:
把nest服务跑起来:
npm run start:dev
浏览器访问:
可以看到,nest读取到了.env里的配置
如果有多个配置,比如还有个.aaa.env
:
aaa=3
在AppModule中这样指定:
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ConfigModule } from '@nestjs/config';
import * as path from 'path';
@Module({
imports: [
ConfigModule.forRoot({
envFilePath: [
path.join(process.cwd(), '.aaa.env'),
path.join(process.cwd(), '.env'),
],
}),
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
前面的配置会覆盖后面的配置。
重新跑一下,并访问:
可以看到aaa的值被覆盖了
如何配置多环境呢?
在项目根目录下分别创建.env
、.env.dev
、.env.prod
文件并且在ConfigModule
中加载:
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ConfigModule } from '@nestjs/config';
@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true,
envFilePath: ['.env.dev', '.env', '.env.prod'],
}),
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
安装依赖包来配置设置当前环境:
npm install cross-env
手动配置启动环境的配置,修改package.json
文件启动命令:
"start": "cross-env RUNNING_ENV=dev nest start",
"start:dev": "cross-env RUNNING_ENV=dev nest start --watch",
"start:debug": "nest start --debug --watch",
"start:prod": "cross-env RUNNING_ENV=prod node dist/main",
然后在appModule.ts中写入如下内容:
可以看到,不用环境中启动,会加载不同的.env
配置文件