至此我的小站已经上线,功能还在迭代中。说实话,距离1.0版本发布还有50%的时间。下面记录一下我之前做过的一些内容,以及技术路线上的一些改进:首先,这是一个我个人统计研究和展示的网站。目前的核心是一个CMS系统,这是统计用户发布信息的关键Word和情感趋势最初的想法是在zuiwan.org的基础上做一个二级网站。所以在服务端的技术架构上,还是沿用了主站的NODE+EXPRESS的方式。服务器没有使用一直用的MongoDB,而是换成了MySQL,后期也方便Java或者PHP。前端架构方面,没有使用主站的VUE,而是使用了我比较精通的NG1.5。服务器结构:Index->??Router->Model->DAO->MySQL=>HTTP类型api访问流程Index->??static=>静态页面访问流程Index->??socket.ioHandler->Model->DAO->MySQL=>最初没有socket接口访问流程的socket.io。当时尝试用普通的HTTP接口直接实现,但是实时性需要一个定时器进行训练。后来考虑到后面的扩展,就直接用socket.io了。model层一开始是用来bonding的,接收req,res,然后直接在model层做res.end()。但是后来在扩展socket的时候发现这样会导致耦合度急剧增加。于是改为接收数据,cb,然后把通用的响应体丢给cb。在之前的设计中,一直不知道model层怎么设计,为什么router不能直接和dao调度交换数据。然后看到了他们的java实体类——我的天啊,为什么一个Model对应一个dao,是不是更不合理。后来真正开始自己的写法的时候,发现了一个小思路——比如user模块,一方面接受上层路由过来的各种相关方法,另一方面不只是一个Daomethod对应一个user,其实涉及到很多dao,比如token,relation等等。至于token的dao,是不可能单独用一个Model去对应的。——这是我的思路。这样一来,我实际上失去了Controller层。感觉Model在java中封装了dao之后,在Controller中调用各个Model。但是我还没有发现这样的优势。所以坚持自己的想法。另外,在和MySQL交互的时候,我提取了一个dao包,暴露了一个查询方法作为每个dao的基础。上面的dao只需要写dao.query(str,cb)即可。前端:标准NG1.5+UI-Router,BS做上层风格展示。只是用不惯UI.BootStrap。结果,我仍然在与BS作斗争。socket对接沿用前面的代码,service用于存放全局变量。每进入一个页面都需要调用sessioncheck。没有别的可说的了。经验教训:1、在NodeJS编程中,接口的回调参数默认为err、data。以方便错误处理。2.NG-repeat支持子变量过滤,是自动的。3.新学的express-session。4.mysql包的连接池没有关闭,最多10个连接,太多会爆炸。
