veily_base主要是解决目前多应用的公用性代码进行了抽离,以便后面统一维护,统一升级。业务相关的服务会以简单的APP部署,这个基础框架就相当于一个容器,对于以后业务上的微服务拆分会以APP的形式,产品会被包装为选择安装依赖的APP。另外一个目的是减少业务相关的开发,开发人员只需要关注业务功能,不必要关心底层实现,新人能够快速上手,在这一块按照面相对象的思想,对业务功能划分了层次,page,data,dao 层,在业务开发中只需要继承基础的类就可以实现对应的功能。
APP的组织结构
veily_base框架的组织结构
看一下一个最简单的demo代码
page/test.js —page层代码,主要做参数校验
1 | ; |
data/test.js —data层代码,主要做业务逻辑
1 | ; |
dao/test.js —dao层代码,主要做数据库操作
1 | ; |
conf/db/demo.js —主要为数据库配置
1 | ; |
conf/app/global.js —APP层面的全局配置
1 | module.exports = { |
只需将以上代码部署到框架中,即可得到一个最简单的web服务demo,如果需要做数据库操作,另需要在框架中配置数据连接参数
这里我在本地将它部署并启动了,通过访问http://localhost:3000/api/demo/test?word=veilyBase!
即可访问到
看到这里我们可能有很多疑问,为什么这些代码要这样写?为什么我们没有操作request和response就能拿到参数和返回结果?为什么返回参数的格式是这样的等等问题,接下来就围绕这个简单的例子做一个讲解。
veily_base框架中各个文件的作用
通过以上的简单了解之后我们大致知道了base框架各个模块的作用是什么,具体是怎么实现的我们还要通过源码来分析。
源码分析
项目启动入口
整个项目的启动入口是在bin目录下的www文件
这里www文件只做了一件事,就是加载http模块和app模块,然后创建一个服务对象监听3000端口。
server.keepAliveTimeout
新增于: v8.0.0,服务器在完成写入最后一个响应之后,在销毁套接字之前需要等待其他传入数据的非活动毫秒数。 如果服务器在保持活动超时被触发之前接收到新数据,它将重置常规非活动超时,即
server.timeout
。值为0
将禁用传入连接上的保持活动超时行为server.timeout
认定套接字超时的不活动毫秒数。值为
0
将禁用传入连接的超时行为。server.listen()
启动 HTTP 服务器用于监听连接。
http是node自带的模块,这里最重要的是关注app模块的加载。
app模块
library/init模块
Node.js模块解决了模块化私有作用域的问题,每一个模块都有一个私有的作用域,外部不可以直接访问模块内部作用域,只有通过exports导出的对象才能被访问。
尽管Node.js十分强调模块的重要性,但是还是设计了全局作用的概念,用于全局内任何一个模块内部访问和使用,增加代码可复用性,这个全局的命名空间被称为global,它是一个对象。在global上挂载了很多属性、方法和类。
这里给global上挂载了shared和logger
- logger是一个全局日志方法
- shared是一个全局共享的map,用于一些简单变量共享传递
- child_pid 子进程
- root 根目录的路径
- base 一些基类
routes/init模块
这里先获取到全部的匹配文件列表,然后循环挂载基础路由和router中间件,router里初始化了各个app的page层里的路由映射,绑定了对应的路由和函数
router里的函数
路由层中间件回调函数,通过路由对应的app和action创建了对应的路由page层实例对象,然后拿到了参数执行了对应的方法。