如果你对koa还不了解的话,可以先阅读 《什么是koa?》这篇文章内容,可以帮助你快速了解什么是koa!
1. 框架概述
Elpis 是一个基于 Node.js 和 Koa 的企业级应用框架,采用模块化设计,支持多环境配置(local、beta、prod),旨在提供统一、可扩展的企业级应用开发解决方案。
2. 整体架构
2.1 目录结构
elpis/
├── app/ # 业务代码目录
│ ├── controller/ # 控制器层
│ ├── service/ # 服务层
│ ├── router/ # 路由定义
│ ├── router-schema/ # 路由参数校验规则
│ ├── middleware/ # 中间件
│ ├── extend/ # 扩展模块 如日志工具log4js
│ └── public/ # 静态资源
├── elpis-core/ # 框架核心
│ ├── loader/ # 模块加载器
│ ├── env.js # 环境配置
│ └── index.js # 框架入口
├── config/ # 配置文件
└── index.js # 项目启动入口
2.2 核心组件
-
框架核心 (elpis-core)
- 负责整个应用的启动和模块加载
- 通过不同的加载器加载业务模块
-
模块加载器 (Loaders)
- config.js: 加载配置文件
- controller.js: 加载控制器
- service.js: 加载服务
- middleware.js: 加载中间件
- router.js: 加载路由
- router-schema.js: 加载路由参数校验规则
- extend.js: 加载扩展模块
Loader其实就是遍历加载app目录下的业务文件,然后挂载在app对象实例下,方便在运行时直接调用。
3. 业务模块 (app/)
- controller: 处理请求和响应
- service: 实现业务逻辑
- router: 定义路由映射
- middleware: 处理请求中间逻辑
- extend: 扩展应用功能
那么问题来了:这跟koa有什么关系呢?
接下来,就通过一个洋葱圈图,来说明是如何用koa框架来实现的。
3. 框架特性
3.1 模块化设计
框架采用模块化设计,将不同功能划分为独立模块:
- Controller-Service 模式:遵循 MVC 架构,控制器负责处理请求,服务负责业务逻辑
- 自动加载机制:通过 loader 自动扫描并加载各模块
- 命名转换:文件名自动转换为驼峰命名(如 custom-module 转为 customModule)
3.2 多环境支持
框架支持三种环境:
- local(本地开发)
- beta(测试环境)
- prod(生产环境)
配置加载器会根据当前环境加载对应的配置文件,优先级为环境配置覆盖默认配置。
3.3 中间件系统
框架实现了完整的中间件系统,包括:
- 错误处理中间件(error-handler) 【在洋葱圈的最外层用 try catch 捕获所有的错误】
- API 签名校验中间件(api-sign-verify) 【请求头里面用md5校验】
- API 参数校验中间件(api-params-verify) 【ajv和jsonschema配合校验路由】
中间件按照注册顺序执行,提供了请求处理前后的钩子。
3.4 路由与参数校验
- 路由采用 koa-router 实现
- 支持基于 JSON Schema 的参数校验
- 通过 router-schema 定义接口参数校验规则
3.5 扩展机制
框架支持通过 extend 目录扩展应用功能,如日志扩展等。
4. 工作流程
-
应用启动时,通过 index.js 调用 elpis-core/index.js 的 start 方法
-
框架初始化 Koa 实例并设置基础配置
-
加载顺序优化说明:
-
- config 配置最先加载:
- 配置信息是基础,其他模块可能需要根据配置进行初始化
- 例如数据库连接、API密钥等都需要在其他组件初始化前准备好
-
- extend 扩展功能其次:
- 扩展功能可能被其他模块使用,应该在service等之前加载
- 为其他模块提供扩展能力
-
- service 服务层第三:
- 服务层是业务逻辑的核心,通常不依赖controller等上层模块
- 但可能需要配置信息和扩展功能
-
- routerSchema 路由模式:
- 路由校验规则,依赖关系较少
-
- middleware 中间件:
- 中间件可能需要用到service、config等
- 需要在路由注册前准备好
-
- controller 控制器:
- 控制器依赖service等组件
- 是路由处理的直接执行者
-
- 全局中间件:
- 必须在路由之前注册,但需要controller等已经加载完成
-
- router 路由:
- 最后加载,因为它需要所有controller已经准备就绪
- 路由是实际的请求入口点
- 启动服务监听端口
5. 技术栈
- 后端框架:Koa 2.7.0
- 路由:koa-router 7.4.0
- 参数校验:Ajv (Another JSON Schema Validator)
- 日志:log4js 6.9.1
- 构建工具:Webpack 5.88.1
6. 总结
Elpis 框架通过模块化设计和自动加载机制,提供了一套完整的后端开发解决方案。其核心优势在于:
- 清晰的架构分层,便于维护和扩展
- 灵活的模块加载机制,支持自动扫描和注册
- 完善的中间件系统,提供统一的请求处理流程
- 强大的参数校验功能,确保接口安全性
- 多环境支持,适应不同部署场景