里程碑1:基于 nodejs 实现服务端内核引擎

0 阅读3分钟

Koa 中集成 Elpis-Core

一、Elpis-Core 是什么?

Elpis-Core 是基于 Node.js + Koa 封装的企业级开发框架核心层,本质是「Koa 生态的工程化增强工具 + 约定式开发运行时」—— 它不替代 Koa,而是在 Koa 基础上解决「模块加载、目录规范、配置管理」等工程化问题,让开发者无需关注繁琐的脚手架配置,专注写业务代码。

二、Elpis-Core 的目的?

  通过技术封装、规范注入、能力扩展三大核心动作,解决 Node.js 原生 / 开源生态的 “通用化” 与团队业务 “定制化” 之间的矛盾

特性

  • 基于 Koa 洋葱圈模型,支持 async/await

  • 自动加载 controller /middleware/service /router

  • 约定大于配置,统一项目结构

  • 内置参数校验、路由 schema、应用扩展

  • 支持数据库统一交互与连接管理

  • 轻量、可扩展、适合中后台服务

洋葱圈模型

image.png

三、基于这个洋葱圈模型,进行项目架构搭建

  • 左侧(静态文件) :需要按约定目录存放业务代码

    • app/config/**/*.js:配置环境(本地/测试/生产)
    • app/middleware/**/*.js:中间件(请求拦截 / 增强)
    • app/router-schema/**/*.js:路由校验规则(参数校验 Schema)
    • app/router/**/*.js:路由定义(URL 映射)
    • app/controller/**/*.js:控制器(处理请求入口)
    • app/service/**/*.js:业务服务(核心业务逻辑)
    • app/extend/**/*.js:框架扩展(给 Koa 实例挂载自定义方法)
  • 中间(elpis-core Loader) :核心加载器

    • 它会自动扫描约定目录下的所有文件
    • 解析文件导出的模块(Controller/Service 等)
    • 按目录语义,将这些模块 ** 挂载到右侧的 Koa 实例(app)** 上
  • 右侧(运行时动态) :Koa 实例 app 上挂载了所有业务模块

    • app.config:不同环境下的配置

    • app.middleware:所有中间件

    • app.routerSchema:所有路由校验规则

    • app.router:所有路由

    • app.service:所有服务

    • app.controller:所有控制器

    • app.routerSchema:所有路由校验规则

    • app.[对应文件名]:扩展模块自动挂载到 app 上

    • 最终,实现 通过特定 的方式进行访问:

      • app.config.${文件}(config.环境.js)
      • app.middlewares.${目录}.${文件}
      • app.routerSchema.${接口路口}
      • app.router.${文件}
      • app.controller.${目录}.${文件}
      • app.service.${目录}.${文件}
      • app.${文件}

image.png

四、相关中间件和插件的理解

1、koa-static 静态资源

为了解决静态资源的加载,可以在app/public目录下自动加载相关的静态资源,如:css、png等。

2、koa-nunjucks-2 模板渲染引起

用于服务器端渲染 HTML(SSR)

3、koa-bodyparser 模板渲染引起

koa-bodyparser 用于解析 HTTP 请求体,并将数据挂载到 ctx.request.body ,因为Koa 默认无法直接获取请求体中的 body 数据。

4、log4js 日志工具,属于extend拓展功能

外部调用 app.logger.info app.loger.error

通过插件把日志输出并落地到磁盘

5、error-handler 运行时错误捕获

对一些异常的报错进行处理,避免用户请求服务出问题,返回一些不必要的内容

6、api-params-verify 参数校验

通过 json-schema & ajv 对 API 规则进行约束,配合 api-params-verify 中间使用

7、api-sign-verify API签名合法性校验

前后端约定好一个signKey,前端通过在请求头中,传 signKey + 时间 进行md5加密,传给后端。后端利用signKey 和 传过来的时间,进行md5加密,对比是否一致,从而判断接口的合法性

五、总结

1、通过实现elpis-core的封装,加深了模块化的理解。每一层的中间件都是紧密关联,为了下一层中间件而做准备。 router、controlller、service,三者形成了MVC模型,而elpis-core可以理解为更好的去使用这个MVC模型

2、写代码之前,需要先分析逻辑,每一步写上注释,先处理数据,再进行下一步的操作