一.单个环境dotenv 多环境dotenvx dotenv.config等方法
1.dotenv的使用
(1).安装依赖:npm install dotenv --save。
(2).在根目录下创建.env文件,内容举例:S3_BUCKET="YOURS3BUCKET"
(3).导入:如果需要使用dotenv的方法,在需要使用的地方require('dotenv').config()进行导入,es6采用import 'dotenv/config'进行导入,然后调用方法。(4).使用:process.env.S3_BUCKET
2.dotenvx的使用(多环境还可以使用dotenv-vault)
(1).安装依赖:npm install @dotenvx/dotenvx --save。
(2).在根目录下创建.env.production文件,内容举例:S3_BUCKET="YOURS3BUCKET"
(3).终端命令(dotenvx run --env-file=.env.production指定配置文件,用--和后面的真正执行命令做区分,nest start --watch真正执行的命令):"start:dev": "dotenvx run --env-file=.env.production -- nest start --watch"。这个命令常被放在package.json文件中的script中。
(4).使用:在需要使用的时候直接从process.env.S3_BUCKET即可得到YOURS3BUCKET。
3.dotenv方法
(1).config
作用:config将读取您的 .env文件,解析内容,将其分配给 process.env,并返回一个包含加载内容的 parsed键的Object,如果失败则返回一个 error键。
举例:
const result = dotenv.config()
if (result.error) {
throw result.error
}
console.log(result.parsed)options选项:
debug 默认值:
false
打开日志记录以帮助调试某些键或值未按预期填充的原因。override覆盖 默认值:
false
使用您的.env文件中的值替换已在计算机上设置的所有环境变量。如果在option.path
中提供了多个文件,则也将使用覆盖,因为每个文件都与下一个文件相结合。如果没有设置override
,则第一个值获胜。如果设置了override
,则最后一个值获胜。encoding编码 默认值:
utf8
指定包含环境变量的文件的编码。path路径 require('dotenv').config({ path: '/custom/path/to/.env' }) 或require('dotenv').config({ path: ['.env.local', '.env'] })。默认为根目录下的.env文件,如果指定里path,则加载path的文件,可以传数组,将按顺序解析并与
process.env
(或option.processEnv
,如果设置)组合。为变量设置的第一个值将获胜,除非设置了options.override
标志,在这种情况下,最后一个值将获胜。如果一个值已经存在于process.env
中,并且未设置options.override
标志,则不会对该值进行任何更改。processEnv:const myObject = {};require('dotenv').config({ processEnv: myObject }); process.env中的值会被放入myObject中,并且不能修改process.env
DOTENV_KEY:用于解密 略
(2).parse
作用:使用解析包含环境变量的文件内容的引擎。它接受一个String或Buffer,并将返回一个包含解析后的键和值的Object。
举例:
const dotenv = require('dotenv')
const buf = Buffer.from('BASIC=basic')
const config = dotenv.parse(buf) // will return an object
console.log(typeof config, config) // object { BASIC : 'basic' }options选项:
const config = dotenv.parse(buf, { debug: true })
debug 默认值:
false
打开日志记录以帮助调试某些键或值未按预期设置的原因。
(3).populate
作用:对
process.env
进行扩展举例:const dotenv = require('dotenv')
const parsed = { HELLO: 'world' }dotenv.populate(process.env, parsed)
console.log(process.env.HELLO) // world
options选项:
dotenv.populate(target, parsed, { override: true, debug: true })
debug 默认值:
false
打开日志记录以帮助调试某些键或值未按预期填充的原因。override覆盖 默认值:
false
删除已设置的所有环境变量。
(4).decrypt:解密 略
二.config配合cross-env
1.config的使用
1.npm install config
2.根目录下创建config文件,config依赖会自动读取config文件夹下的default.json文件,如果指定了NODE_ENV,还会读取对应的NODE_ENV.json 文件夹,并且如果有一样的内容,后者会覆盖前者
3.创建default.json文件放于config文件夹下,内容例如:{"optionalFeature":{"detail":12}}
4.导入:const config = require('config'); es6导入采用import * as config from 'config';
5.使用:
if (config.has('optionalFeature.detail')) {
const detail = config.get('optionalFeature.detail');
}6.如果想配置多环境,可以在终端里输入环境export NODE_ENV=production或采用cross-env
2.cross-env的使用
1.安装:npm install --save-dev cross-env
2.使用:cross-env NODE_ENV=production即环境配置
{ "scripts": { "build": "cross-env NODE_ENV=production webpack --config build/webpack.config.js" } }
三.nestjs中的环境配置
1.@nestjs/config的使用
1)安装:npm i --save @nestjs/config
2)在app.module.ts文件中,把ConfigModule.forRoot()放在imports中
javascript">import { Module } from '@nestjs/***mon';
import { ConfigModule } from '@nestjs/config';
@Module({
imports: [ConfigModule.forRoot()],
})
export class AppModule {}
3)使用:将ConfigService导入到要使用的地方,获取配置使用this.configService.get('port')即可,注意:这里的constructor(private configService: ConfigService){}是简写,代表在这个类中定义了一个私有属性configService,并且在初始化这个类的时候给予赋值
import { Inject, Injectable } from '@nestjs/***mon';
import { ConfigService, ConfigType } from '@nestjs/config';
@Injectable()
export class AppService {
constructor(private configService: ConfigService){}
getHello(): string {
console.log(this.configService.get('port'));
return 'Hello World1!';
}
}
4)ConfigModule.forRoot({isGlobal: true});设置为全局模块
2.环境配置
1)自定义配置文件方式的实现
1.建立一个文件,写入以下内容
export default () => ({ port: parseInt(process.env.PORT, 10) || 3000, database: { host: process.env.DATABASE_HOST, port: parseInt(process.env.DATABASE_PORT, 10) || 5432 } });
2.在需要使用的module中导入1中的内容 并且用load函数进行加载
import configuration from './config/configuration'; @Module({ imports: [ ConfigModule.forRoot({ load: [configuration], }), ], }) export class AppModule {}
3.但是,当我们这么做的时候,虽然可以用configService进行读取,然而并不能用ConfigModule.forRoot中的validationSchema使用joi进行验证,所以我们如果要对这些内容进行验证,需要自定义验证函数
修改1中的内容为
const configuration = () => ({ someConfigKey: '1', }); const validate = (config) => { const schema = Joi.object({ someConfigKey: Joi.string().required(), }); const { error, value } = schema.validate(config); if (error) { throw new Error(`Configuration validation error: ${error.message}`); } return value; }; const validatedConfig = () => validate(configuration()); export default validatedConfig
2)cross-env方式的实现
1.这个主要是利用了ConfigModule.forRoot的envFilePath去自定义环境配置文件
ConfigModule.forRoot({ //'.env.development.local'也可以是字符串 //当是数组时。如果在多个文件中找到一个变量,则第一个优先。 envFilePath: ['.env.development.local', '.env.development'], });
2.在package文件夹中用cross-env指定环境变量
3.const envFilePath = `.env.${process.env.NODE_ENV || `development`}`;获取到环境配置文件,把该路径给予1中的envFilePath即可