elpis学习笔记-内核篇(elpis-core)

6 阅读2分钟

项目架构描述

├── 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