一个运行速度快、开发速度快的 Node.js 服务端解决方案,基于 KOA
前提1:确保已安装Node JS
前提2:修改env中的服务器地址,使用你自己的
前提3:复制password.sample.js并重命名为password.js,且填写正确的密码
npm install (安装依赖包)
npm start (启动开发,env为dev)
npm run pm2 (线上部署,env为online)
npm run test (单元测试)
每个model自带数据库11基本种操作(增、删、改、查页、查全、模糊查[借助list或者all,参考router/book/search]、求和、计数、自增、一带多),支持事务
文件上传
循环定时任务、计划定时事件
接口权限认证
redis 缓存 session
短信验证码发放(需要调整代码,调用短信服务)
webhook 自动上线
单元测试
事件订阅
-
通用业务高度重复
在开发一个常规服务器业务的时候,绝大部分接口,都是在进行数据库的增删改查、联表查询、模糊搜索等操作,这是一个非常重复劳动 开发中,我们对数据库的操作,分为两类:单表操作和多表操作。针对这两类常见业务,我们对其进行了封装和规范,提高其复用程度
-
开发人员习惯不同
一千个工程师,有一千种开发风格,很多时候,这些风格并没有好坏之分,只有喜好与否。统一其开发习惯,是一件提高效率的事情,每个人的想法不一样,最简单的想法最容易被接受和理解
-
项目架构不合理,难以扩展
小型项目中,扩展性的问题不必考虑太多,但是一旦项目到了一定的规模,就会非常的麻烦。比如,公用业务的调用问题比如,用户的授权问题比如,接口数量巨大导致的项目结构问题...等等,这些问题都需要一种可扩展的、稳定、简单的方式去解决
针对以上这些问题,组织了这样的一个解决方案,Fast Server:
-
复用
高度复用关键代码,节省大量人力,并且提高其可靠性
-
简单
以文件和文件夹这种最基本、简单的方式来组织代码,避免层层封装,直观、简单、易定位问题,以最低成本迁就工程师的习惯,5分钟成为API开发高手
-
预定义规范
针对常见的功能,考虑项目本身变的大而复杂的可能,做了非常合理的预定义配置:从项目结构,到功能设置...在此约定下,可以保证可持续开发,合理的预定义规范,可以保证代码的持久健壮性
-- config 配置文件
-- auth 需要认证的接口列表
-- env 环境变量,及其配置
-- enums 全局变量统一的枚举值
-- sequelize MySQL 相关的配置
-- session Redis 相关的session配置
-- dao 数据操作方法,自带有基本方法,可自定义方法,请参考 dao/book
--__common.js 为公共dao提供统一的入口,会被所有的dao引用,在router可直接使用
-- lib,各种库文件代码
-- models 数据模型,将自动会同步到数据库
-- router 路由地址,所有的 api 操作
--__view 专门为MVC模式提供的router文件夹,若没有view此文件夹为空
-- service,若有,抽象出来的公共业务代码,注意:lib 提供业务无关方法,而 service 则针对具体业务
-- test 单元测试文件夹, 所有的测试用例
-- manual 若有,存放手动测试代码,不会跑单元测试
-- utils 插件和库
-- event,事件处理器所在文件夹,任何地方通知了,都在此响应
-- midware,自定义的 KOA 中间件,请注意开发格式
-- schedule,循环任务和计划任务处理文件夹
-- views 如果是后端 MVC 架构代码渲染模板,view应该放在此处
后端框架:KOA
数据模型:Sequelize
Session选型:koa-redis + koa-generic-session
-- 1.定义 model,修改数据库字段定义,直接从以前的 model 文件复制修改即可
-- 2.定义 dao,直接复制一个基本的 dao 就好,比如 book,甚至代码都不用动
-- 3.定义 router 也就是 api 文件 URL,这里可能操作一个 dao,也可能操作好几个 dao
-- 4.我们以 model-->dao-->router 的顺序来开发,有时候,一个 router 并不只是调用了一个 dao,或者一个 dao 也不止调用了一个 model,这时候,我们以入口,或者主要的 model 来决定放置 router 文件的位置
-- 5.有的 router 可能不涉及到 dao 操作,比如 sms,file,webhook,此时,我们可以按照功能的分类来组织模块
-- 1. 5个基本方法,增、删、改、查:add、delete、update、list(查页)、all(查全)
-- 2. 4个高阶方法,求和、计数、自增、模糊搜索:sum、count、increment、search
-- 3. 一对多关联查表方法,一对多:list_include(复数),此处请参考dao 代码: author/list_include_books
-- 4.事务请参照dao/book/sale_an_author_book
-- 5. 其他自定义方法,按照实际需求在每一个 model 对应的 dao中自由定制
-- 1.所有的请求均使用 post 方法,且一般情况使用x-www-form-urlencoded
-- 2.请注意,delete 等接口的参数在 query 里面,也就是 get 参数里面,为什么如此呢?因为要区分实体数据和附属数据,一个走POST,一个走GET
-- 3.导入postman 后请记得启动服务器,然后可以直接测试接口
-- 1.所有的数据结构都应该在 model 里面定义,这个文件夹的存在就是完全为了数据结构而生,不应该有其他任何操作,这在多种框架内都有提供,不赘述
-- 2.所有的数据操作均应该在 dao 里面:可以在这个文件里放任何复杂的、基本方法不满足的数据操作方法,在外层的 router 直接调用同一个方法即可,这对于保证数据一致性非常有用。另一个场景,sequelize 的方法无法完成查询,必须依赖非常复杂的原始 SQL 语句,那么也可以封装在 dao 里面
-- 3.任何可以共用的业务逻辑,应该放在 service 里面,本项目展示的主要是数据操作,但是很多项目会有各种上下游依赖等业务需求,凡是公用的业务方法,都应该被封装,然后保持 router 的简洁性
-- 4.对任何权限操作、数据处理,均应该与 router 分离,也就是:在 utils 里面提供公用的数据、权限处理方法供 router 调用,或者在统一的中间件里面做授权处理,减少router的代码量
-- 5.所有的延时方法均应该使用异步,异步是 node 的灵魂,必要的时候可以使用 child_prosess
-- 6.定时、任务应该统一管理,都应该放在 utils/crontab 里面
-- 7.与业务无关的公共方法,应该放在 lib 里面
-- 8.中间件应该采用标准的 KOA 格式,放在 utils/midware 里面
--1.核心代码复制粘贴化
--2.参数操作、数据库操作 Json 化:
这是对比PHP和Java的重要优势,因为 Json(JavaScript Object Notation) 是JS原生支持的,并且JS支持对象展开操作,...运算符,可以将参数简化,直接省去了一次次的无聊的参数接受、返回的重写
--3.联表查询傻瓜化
--4.常见业务标准化
--1.常规业务有覆盖,但是可能缺失特定功能,比如对PDF的操作,后续要加上
--2.作为自用快速Starter,大家如果使用过程中遇到了问题,欢迎拍砖和交流
--1.所有的session应该保存在Redis,服务器上除了代码,不应该放任何文件:上传文件、文件session、日志等,应该放在OSS,这样才能够便于扩展集群能力,使用nginx的负载均衡
--2.socket.io扩容的时候,请注意,因为socket虽然不产生文件,没有文件同步问题,但是,他必须绑定IP,因此有IP问题,请参考: https://www.cnblogs.com/zzsdream/p/8403786.html