迄今为止我的那个小网站已经发布到网上了,然而功能还在迭代中,真的说起来的话,现在距离1.0版本的发布,还差50%。现在记录一下之前做的一些内容,以及一些技术路线方面的改进吧:
首先,这是一个用于我个人统计研究和展示的网站,当前的核心是一个CMS系统,想要统计用户发布信息的关键词与情感趋势
最初的想法是在zuiwan.org的基础上,做一个二级网站。所以在服务端技术架构上,依然沿用主站的NODE+EXPRESS的方法,服务器没有采用一直使用的MongoDB,而是换成了MySQL,也方便后期上Java或者PHP。
前端架构上,也没有采用主站的VUE,而是沿用了我更加熟练的NG1.5。
服务端结构:
Index->Router->Model->DAO->MySQL => HTTP型api访问流
Index->static => 静态页面访问流
Index->socket.io Handler->Model->DAO->MySQL => socket接口访问流
最初是没有socket.io的,当时试图直接用普通的HTTP接口来实现,但是实时性需要用计时器来轮训,后来考虑到后期扩展,直接使用了socket.io。
model层最初被用来做黏合,接收的是req,res,然后直接在model层做了res.end()。但是后期在扩展socket的时候发现,这样会导致耦合度激增。于是改为了,接收data,cb,然后把通用的response体扔给cb的形式。
在之前的设计里,我一直不知道model层该如何设计,为何router不能直接与dao进行调度和数据交换。然后看到他们的java实体类——天了噜,为何一个Model要对应一个dao,这岂不是更没有道理了。
后来我真正开始自己的写法的时候,就找到了一点点思路——比如用户模块,一方面对上层接受的是路由过来的各种相关方法,一方面,并不只是对应一个user的Dao方法,其实涉及到很多个dao,比如token、relation等等。而token这个dao,也不可能单独拿一个Model去对应。——这是我的思路。
这么说来,其实我是少了Controller层。感觉java里Model封装了dao之后,在Controller里调用了各个Model。但是我暂时还没有找到这样的优势。所以还是沿用自己的思路吧。
另外,在与MySQL交互的时候,我抽取了一个dao的封装,暴露了一个query方法,作为各个dao的根基,上面的dao就只需要写dao.query(str, cb)就好了。
前端:
标准的NG1.5+UI-Router,BS做了上层样式展现。只是我一直用不惯UI.BootStrap。导致我现在还在用BS苦苦支撑。
Socket对接沿用了之前的代码、service用来存储全局变量。每个页面进入时需要调用session检查。
其他的无甚好说了。
经验教训:
1.NodeJS编程中,接口的回调参数,默认是err, data。以方便错误处理。
2.NG-repeat是支持子变量过滤的,自动的。
3.新学了express-session。
4.mysql包的连接池,不关闭,最多10个连接,多了会爆掉。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。