0


前端 常见的环境配置方式以及nestjs环境配置

一.单个环境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中

import { Module } from '@nestjs/common';
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/common';
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即可

标签: javascript

本文转载自: https://blog.csdn.net/weixin_58555796/article/details/136219679
版权归原作者 weixin_58555796 所有, 如有侵权,请联系我们删除。

“前端 常见的环境配置方式以及nestjs环境配置”的评论:

还没有评论