提示:
下面代码中,用到了数据库的连接配置,不太清楚怎么配置的,可以先看看
.env 配置文件
用于存储应用程序的配置参数
通过使用.env文件,可以将应用程序的配置参数集中管理,以便于修改、备份和恢复。
举个例子:
分类:
- 基本的是应用程序的配置参数,例如:
PORT是应用程序监听的端口号 - 以
DB_开头,表示数据库的配置参数,例如:DB_PORT是数据库的端口号 - 以
KAFKA_开头,表示消息队列的配置参数,例如:KAFKA_ADDRESS是消息队列服务器地址 - 以
FAQ_开头,表示同步的配置参数,例如:FAQ_SYNC_TO_KAFKA = true是是否同步到消息队列 - 自定义配置参数,除开头名字以外,基本都遵循语义写法
// 应用程序监听的端口号
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类型的对象。目的:为了将应用程序的默认配置和业务配置合并为一个对象,方便进行统一管理和访问。