前端项目配置文件(config)、环境变量文件(.env)

899 阅读5分钟

提示:

下面代码中,用到了数据库的连接配置,不太清楚怎么配置的,可以先看看

.env 配置文件

用于存储应用程序的配置参数

通过使用.env文件,可以将应用程序的配置参数集中管理,以便于修改、备份和恢复。

举个例子:

分类:

  1. 基本的是应用程序的配置参数,例如:PORT是应用程序监听的端口号
  2. DB_开头,表示数据库的配置参数,例如:DB_PORT是数据库的端口号
  3. KAFKA_开头,表示消息队列的配置参数,例如:KAFKA_ADDRESS是消息队列服务器地址
  4. FAQ_开头,表示同步的配置参数,例如:FAQ_SYNC_TO_KAFKA = true是是否同步到消息队列
  5. 自定义配置参数,除开头名字以外,基本都遵循语义写法
// 应用程序监听的端口号
PORT=8888
// 应用程序启动时,将会创建3个worker进程进行处理
EGG_WORKERS=3
// 应用程序是否运行在私有模式下,值为true表示是
IS_PRIVATE=true

// 数据库的类型
DATABASE_DRIVER=mysql
// 要连接的数据库名
DB_NAME=web
// 数据库服务器的IP地址
DB_HOST=127.0.0.1
// 连接数据库的端口号
DB_PORT=8888
// 连接数据库的用户名
DB_USERNAME=root
// 连接数据库的密码
DB_PASSWORD=123456

// Kafka消息队列服务器地址
KAFKA_ADDRESS=127.0.0.1:8080
// Kafka消息队列的ID
KAFKA_GROUPID = webfaq

// FAQ是否同步到Kafka消息队列中,值为true表示是
FAQ_SYNC_TO_KAFKA=true

// SSP测试环境的地址
SSP_ADDRESS_TEST=http://127.0.0.2:8080
// SSP演示环境的地址
SSP_ADDRESS_DEMO=http://127.0.0.3:8080
// SSP正式环境的地址
SSP_ADDRESS_FORMAL=http://127.0.0.4:8080

config配置文件

用于存储应用程序配置信息,将应用程序的配置信息集中管理

举个例子:

下面例子中,导入了egg框架的默认配置,定义了接口,来描述应用程序的配置信息,还有对外暴露的配置项。其中很多配置,都使用了环境变量,让配置更加灵活,方便修改,甚至于适配多套配置

// 导入egg依赖模块,这里是用到了两个egg框架接口,他们描述应用程序的配置信息
import {EggAppConfig, PowerPartial} from 'egg';
// 导入NodeJS的核心模块(path),用于处理文件路径
import * as path from 'path';
// 自定义的接口,用于描述应用到的,其他功能库的配置信息
import {QiniuOptionInterface} from '../app/lib/egg-qiniu-upload/lib/qiniu-upload';
// typeorm库中定义的一个接口,用于描述数据库连接的配置信息
import {ConnectionOptions} from 'typeorm';
// Node.js中的一个核心模块,用于处理文件系统
import * as fs from 'fs';
// egg.js框架中定义的一个类型,用于描述HTTP请求的上下文信息
import { Context } from 'vm';
// 自定义的函数,用于哪里看需求
import { isAuthBySign } from '../app/util/sign';

// 自定义的接口,用于描述应用程序的业务配置信息
export interface BizConfig {
  // 自定义接口类型`ServerAddressInterface`,用于描述服务器的地址信息
  serverAddress: ServerAddressInterface;
  // 自定义的接口类型`ConnectionOptions`,用于描述数据库连接的配置信息
  typeorm: ConnectionOptions & any;
  // 一个布尔类型,用于表示是否为私有云部署
  isPrivate: boolean;
  // 一个字符串类型,用于表示数据版本号
  dataVersion: string;
  // 一个字符串类型,用于表示管理员token
  adminToken: string;
  // 产品系统的外网地址
  webAddress: string; 
  // 产品系统的内网地址,例: 127.0.0.6:8888
  webLocalAddress: string; 
  // 一个字符串类型,用于表示应用程序的根目录路径
  appRootPath: string; 
}

// 自定义接口,在这里是为了简化其他接口的配置
export interface ServerAddressInterface {
  [key: string]: {
    // 一个字符串类型,表示协议类型,只能是`http`或`https`
    protocol?: 'http' | 'https',
    // 一个字符串类型,表示域名
    domain: string,
    // 一个可选的字符串类型,表示域名的演示版本
    domainDemo?: string,
  };
}

// 默认导出函数
export default (appInfo: EggAppConfig) => {
  // 将定义的配置和`egg`框架默认配置,合并为一个对象
  const config = {} as PowerPartial<EggAppConfig> & BizConfig;
  // 应用程序名称后加上一段字符串,可作为密钥
  config.keys = appInfo.name + '_123456789_1314';
  // 自定义接口权限校验配置项
  config.interfaceAuth = {
    // `match`函数接收一个`ctx`参数,表示请求上下文对象
    match(ctx: Context) {
      // 进行接口权限校验的URL的前缀,如下面:`/api`
      const apiHeads = ['api'];
      // 正则表达式对象,匹配URL是否以 `/api` 开头
      const reg = new RegExp(`^/(${apiHeads.join('|')})`);
      // 判断传入的`URL`是否匹配正则和通过签名校验
      return reg.test(ctx.request.url) && isAuthBySign(ctx);
    },
  };
  // 连接数据库的一些配置项
  config.typeorm = {
    type: process.env.DATABASE_DRIVER as any,
    host: process.env.DB_HOST,
    port: +(process.env.DB_PORT || 3306),
    database: process.env.DB_NAME,
    username: process.env.DB_USERNAME,
    password: process.env.DB_PASSWORD,
    sid: process.env.DB_SID,
    logging: 'all',
  };
  // 文件上传格式大小配置项
  config.multipart = {
    fileExtensions: ['.pdf', '.docx', '.xlsx', '.xls', '.json', '.txt', '.ico', ''],
    fileSize: '100mb', // 放宽整体限制,具体接口限制在业务逻辑中判断
  };
  // 登录token相关配置信息
  config.token = {
    // 表示登录令牌的名称
    name: 'root',
    // 表示登录令牌的加密密钥
    secret: '123456',
    // 表示登录令牌的有效期
    maxAge: 604800 * 1000, //这里是 one week
    // 表示登录令牌的作用域
    domain: process.env.DOMAIN,
    // 表示业务ID的请求头名称,业务ID是一个自定义的标识符,用于标识不同的业务场景。
    bizHeader: 'name-id',
  };
  ......
  ......
  // 返回项目的所有配置项
  return config;
}
  

上面代码中,最核心的是const config = {} as PowerPartial<EggAppConfig> & BizConfig;下面逐字说明一下

  • PowerPartial是一个类型,它可以把一个类型的所有属性变为可选属性,即将所有属性的类型变为该属性的类型或者undefined
  • BizConfig是一个自定义接口,定义了应用程序的业务配置信息。
  • EggAppConfig是egg.js框架中定义的接口,用于描述应用程序的默认配置信息。
  • & 符号表示类型合并,即将两个类型组合成一个类型。
  • as关键字表示类型断言,即将一个变量指定为一个特定类型

将空对象{}断言为PowerPartial<EggAppConfig> & BizConfig类型的对象。

目的:为了将应用程序的默认配置和业务配置合并为一个对象,方便进行统一管理和访问。