项目架构描述
├── app/ # 业务代码目录
│ ├── controller/ # 控制器层(API处理)
│ ├── service/ # 服务层(封装业务逻辑)
│ ├── middleware/ # 中间件文件
│ ├── router/ # 路由定义文件
│ ├── router-schema/ # API参数验证文件
│ ├── extend/ # 框架扩展文件
│ └── public/ # 静态资源文件
├── config/ # 配置文件目录
│ ├── config.default.js # 默认配置
│ ├── config.local.js # 本地开发环境配置
│ ├── config.beta.js # 测试环境配置
│ └── config.prod.js # 生产环境配置
├── elpis-core/ # 框架核心代码目录
│ ├── index.js # 框架启动入口
│ ├── env.js # 环境变量处理
│ └── loader/ # 模块加载器
└── logs/ # 日志目录
Loder描述
config
- 加载 config.default.js 作为基础配置
- 根据环境变量加载对应的环境配置(local(本地)/beta(测试)/procution(生产))
- 环境配置 object.assign 覆盖默认配置,挂载到 app.config
middleware
- 获取 app/middleware/*js (支持多级目录)
- 转换文件名为驼峰命名 (error-handler.js -> errorHandler)
- 挂载到app.middlewares (errorHandler -> app.middlewares.errorHandler)
controller
- 扫描 app/controller/*js (支持多级目录) 并且实例化类
- 定义 controller 基类(base.js),处理成功和失败
- 提供 render 方法 渲染页面,实现SSR
- 挂载到app.controller
service
- 扫描 app/service/*js (支持多级目录) 并且实例化类
- 定义 service 基类(base.js)
- 挂载到app.service
extend
- 增加一些额外的拓展服务
- 例如日志app.logger.xxx(这里用了log4js)
router
- 加载所有路由定义文件
- 提供兜底路由,临时重定(302)向到首页
router-schema
- 设置 API 的校验规则
- 挂载到 app.routerSchema
elpis-core 的运行流程
启动阶段
- 初始化 Koa 实例及环境配置
- 依次执行loader: middleware -> router-schema -> controller -> service -> config -> extend -> router
请求验证
- 首先经过 api-params-verify 验证,它会拿请求的 url 去 router-schema 去匹配,用 ajv 校验参数
- 如果校验不通过则直接返回
业务处理
- 请求校验通过后则会经过 controller,controller 调用 service 获取数据,service 处理完返回处理结果给 controller
响应返回
- controller 组装数据赋值给 ctx.body ,然后返回客户端
异常处理
- 常规错误给返回错误码
- 路由错误直接临时重定向到homePage