前端 常见的环境配置方式以及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中

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即可

转载请说明出处内容投诉
CSS教程_站长资源网 » 前端 常见的环境配置方式以及nestjs环境配置

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买