这里来谈谈rest api服务构建。
Express
Express是node做http服务最有名的一个框架了,具体如何安装使用我不做介绍了,大家可以参考官方网站。
ES6
由于ES6的新特性实在是太棒了,所以我选择使用ES6。可是node目前版本v6.0.0对ES6的支持还不够好。还好有babel这个开源库。ES6 语法可以参考阮一峰的这本书 >>
可以直接全局安装 npm install -g babel-cli
,启动时候把node替换为babel-node,就可以完全支持ES6了。
我为了调试方便,所以在代码中启用支持。
首先安装babel依赖库。
1 | "dependencies": { |
然后在app启动的时候导入 ES6 运行环境。
1 | require("babel-core"); |
启动参数可以加上方法缓存 BABEL_CACHE_PATH=./xxx
。
好了我们的项目已经支持 ES6 了,只是启动的时候会有点慢,如果node能直接支持就好了,不过我相信很快就可以了。
MySql
支持 ES6 以后,我们需要添加数据库层,首先安装依赖组件。
1 | "mysql": "~2.10.2", |
这里我经过比较采用了 sequelize
这个ORM。
在添加配置文件 ./bin/config.js
。最好的做法需要配置正式、开发等多套环境,这里我只做一套配置。
1 | const mysql = { |
配置 sequelize
1 | import Sequelize from 'sequelize'; |
好了,我们的数据库服务配置完成。
Redis
同样,首先需要配置文件。这里我配置了2个分别作为数据缓存和 http 缓存使用。
1 | redisCache = { |
对数据缓存做一个简单的封装。使其支持key-value
和key-hashtable
这两种格式就够用了。在设置完后需要设置缓存时间expire
。用于缓存token和验证码等服务。
1 | class Redis { |
使用时只要创建一个具体对象就可以了。
另外,再创建一个http缓存的中间件,用来缓存一些接口变化比较缓慢,实时性要求不高,但需要大量计算的数据。
1 | export default function({ |
这是一个比较简单的实现,key
默认使用url。当然也可以自定义。使用场景:
1 | router.get('/:id', httpCache({ |
这样,我们的数据层都已经配置完毕,接下来需要开始进入实践。
结构
目录结构:
1 | |\ |
这里我为了简化,只把服务分为这些,来减少复杂度,同时又相对解耦。
首先看看model层,这里定义了整个表的结构和数据模型
1 | let User = sequelize.define('user', { |
controller定义所有的逻辑操作,提供包括验证的,但是独立的功能服务。
1 | let Controller = { |
最后,路由来组合其中不同的业务逻辑。
1 | router.get('/:id', (req, res, next) => { |
其他
很多场景,我们需要判断用户登录情况以及一些其他情况,如果在每个请求里面去做判断会是一种非常麻烦的事情,而且也会导致代码冗余和复杂性,这些功能可以做成中间件形式,使用时也会方便很多。
1 | // NeedLogin 伪代码 |
测试
等待加入该模块
下一篇,我们来看看react来构建web应用的框架。