Elpis是一个基于koa服务开发的企业级全栈项目。
BFF(backend for fronted) :可以理解为前端的后端服务,用nodejs来写可以在实现SSR时方便同构。BFF能获取服务端的原子数据,根据需要进行处理,返回给前端。
- 服务端对数据展示服务进行解耦,展示服务由独立的BFF端提供,服务端可以聚焦于业务处理。
- 多端展示或者多业务展示时,对与数据获取有更好的灵活性,避免数据冗余造成消耗服务端资源。
- 对于复杂的前端展示,将数据获取和组装的负责逻辑在BFF端执行,降低前端处理的复杂度,提高前端页面响应效率。
- 部分展示业务,可以抽象出来利用BFF实现,对于服务端实现接口复用。
- 降低多端业务的耦合性,避免不同端业务开发互相影响。
- 其他优势,包括数据缓存,接口安全校验等。
Elpis-core引擎核心内容:
加载磁盘文件(本地)->解析器(loader)->运行时(内存)
包含七大loader
- //路径解析时:遍历应用的相应目录下的所有文件,文件命名为小写字母加连接符“-”和“_”,在路径名解析时需要转化为驼峰形式。
- 1、middlewareLoader:解析/middleware目录下的文件,中间件是返回的一个函数,传入参数app,将解析出来的自定义middleware,挂载到app上(调用时app.middlewares.xxx)
- 2、routerSchemaLoader:定义请求参数的格式,解析出router- schema文件下的所有文件,挂载到app上(app.routerSchema.xxx)
- 3、controllerLoader:业务处理逻辑文件的加载器,controller的文件都是返回的一个类,需要new一下,再挂载到app上(app.controller.xxx)
- 4、serviceLoader:数据服务相关文件加载,可处理数据获取文件,与controller类似,都是返回一个类,需要new操作,挂载在app上(app.service.xxx)
- 5、configLoader:配置文件加载器,加载不同环境的配置文件,加载到app(app.config.属性)
- 6、extendLoader:扩展功能加载器,将extend文件下的扩展功能加载,挂载到app上(app.extend.xxx)
- 7、routerLoader:路由文件加载器,加载文件时需要传入app和router文件,在该loader中需要做路由兜底,并把路由注册到app上。(ctx.params在koa上是不支持访问的,可以引入koa-router中间件后,可获取到。注意自定义的其他的中间件中如果想用params,需要保证koa-router中间件先注册)
应用:
中间件:
- errorHandler中间件,统一处理错误;
- apiSignVerify中间件,校验api请求的签名,从headers中获取传过来的签名信息,使用md5对签名进行加密。
- apiParamsVerify中间件:校验api请求的相关参数,使用jsons-chema和ajv进行校验。
- extend扩展:引入log4js来进行日志打印存储,通过extendLoader将log4js挂载到app上,app.logger
- router路由:页面请求和api请求,此处页面请求相当于SSR渲染
- controller控制器:将公共方法提取出baseController类,其他的可以继承该类。调用service方法
- service服务:也可以提取出基类,service中功能是获取数据
课程笔记
项目初始化:
npm init 生成 package.json 文件,其中 dependencies 是项目运行过程中需要的依赖,devDependencies 是本地开发时需要用到的依赖。 npm install 或找到 package 文件。npm install —save 会只安装 dependencies,—save-dev 会把 devDependencies 也安装。
创建一个入口文件 index.js,创建 koa 服务,并用 node 运行该文件,启动服务 eslint 配置: commit message:(): (例 feat: init project) validate-commit-msg eslint 和 validate-commit-msg 配置到开发流程中,使用 ghooks 可以监听提交代码过程中的钩子,进行设置,commit-msg,pre-commit
elips-core 内核引擎设计
elpis 相当于 eggjs 的一个轻量内核,帮助了解企业级框架 规范的文件目录结构
洋葱圈模型:先入后出 api 请求-路由分发、路由参数校验-中间件-controller-service-中间件-api 响应
elips-core 将 koa 服务封装
实现 middleware、controller 等 loader
错误:envConfig = require(path.resolve(configPath, ${sep}config.prod.js));
少了. resolve 函数会自动加上/
正确:envConfig = require(path.resolve(configPath, .{sep}config.prod.js));
config 加载路径 注意路径处理
应用阶段: 增加启动命令,按照不同环境 nodemon 自动重启 node 启动的服务
页面中引入 css,路径不对,导致 302 重定向(routerLoader 中兜底路由,导致重定向) 使用 koa-static // 配置静态根路径 const koaStatic = require('koa-static'); app.use(koaStatic(path.resolve(process.cwd(), './app/public')));
实现一个接口,路由请求一个 api 路径,调用 controller 中的一个方法 controller 里调用 service 里的方法
controller 设计成类,是因为类可以继承,controller 里的一些公共部分,可以抽象出一个基类
增加可维护性 添加日志 service 层:读写 mysql、日志 使用 log4js 依赖,打印日志,放到 extend 下,挂载到 app
中间件:返回的是一个方法,async (ctx, next) => { try { } catch(e) {} }
引入 bodyParser 中间件 来解析 ctx.body 自定义中间件: 1、错误处理中间件 2、API 签名校验中间件:api 的时效性,防止写脚本或定时任务遍历获取全部内容 (实现一个中间件) 签名合法性校验 md5 3、参数校验中间件 json-schema 校验规则;ajv 校验规则和数据的校验器