前言
本人不是技术专家,该笔记只是从使用语言进行开发的层面上记录一些体会,不包含也不想尝试从源码或者更深的层次去讨论语言本身的优劣。文章内容是笔者的个人感悟,既不保证正确性,也不保证别人能看懂。
这是该笔记的第三篇,用来对最近的NodeJS学习做一个小结,短期内恐怕我不会再更新它了。
第一篇在这里 NodeJS学习笔记: require, exports 和 module.exports 的初印象
第二篇在这里 NodeJS学习笔记: 简述Express的中间件multer的使用
先谈一下本次学习的收获:
1- 对于非阻塞模式的开发有了相应的意识,即从觉得很难读懂源码到现在觉得一切本该如此,这说明我的思维方式改善了。
2- NodeJS是很有趣的东西,但是暂时不适于开发商业的应用。诚然,NodeJS与Express都提供了较好的技术支持与规范的源码,但是太多来自npm的模块做不到这一点,也就是说如果不去更新依赖的资源那么可能存在未知的bug,而更新的代价则是发生各种错误。
3- 综上,我觉得angular之类的技术在相当的一段时期内更有活力,至于后端我还是暂时要回到PHP领域。哦~PHP7
引子
学习NodeJS的原因是我在尝试基于MeanJS框架的基础上进行开发,所以我要先熟悉NodeJS, ExpressJS 和 MongoDB。当时使用的MeanJS框架是0.4.2,现在已经有了0.5.beta了。其实我大约半年以前就接触过这个框架的更早期版本,大致的感觉如下:
早期版本
在前端和后端分别实现了mvc架构,不错的封装,但是使用上稍有不便。目录结构类似:
/app
/modules
/moduleA (比如articles)
/controllers
/models
/services
...
/public
/modules
... (和上面差不多,不废话了)
0.4.2
结构改善了,看起来舒服多了
/modules
/moduleA (比如articles)
/client
...
/server
...
/test
...
当然实际开发的时候太多的近似名称也是挺让人头疼了。
0.5.beta
前端貌似做了一些优化,后端没什么太多的变动。以前的示例代码只有oauth, users (包含头像上传), menu 和 articles,现在又增加了chat。新手其实可以fork它从而更快的入手。
正文
我觉得单独评价RESTful的话并没有什么价值,必须考虑和angularJS或者app开发结合的情况下。虽然如Mongo之类的数据库实现了RESTful接口,但是我觉得没人喜欢从浏览器端直接发起此类请求。
对于单纯的RESTful,我觉得以下就够了:
var policy = {
invokeRolesPolicies: function(){},
isAllowed: function(req, res, next){
var thePolicy = false;
if (req.model) {
if (req.model.policy) {
thePolicy = req.model.policy;
} else {
thePolicy = require('default.restful.policy.js');
}
thePolicy.invokeRolesPolicies();
retuen thePolicy.isAllowed(req, res, next);
}
return next();
}
};
var RESTController= {
this.save = function(req, res){};
this.delete= function(req, res){};
this.read = function(req, res){};
this.list = function(req, res){};
this.loadModel = function(req, res, next, modelName){
req.model = moogoose.model(modelName);
next();
};
this.loadData = function(req, res, next, dataId){
req.data = req.model.findById(dataId);
next();
};
}
app
.route('/rest/:model')
.all(policy.isAllowed)
.get(RESTController.list)
.post(RESTController.save)
;
app
.route('/rest/:model/:id')
.all(policy.isAllowed)
.get(RESTController.read)
.put(RESTController.save)
.delete(RESTController.delete)
;
app.param('model', RESTController.loadModel);
app.param('id', RESTController.loadData);
然后只要增加model来制定数据有效性规则和规定model对应的访问规则就可以了。
尾声
抽象RESTful框架其实是很简单的,一个针对RESTful请求的后端框架应该包括以下的部分:
1-安全验证:确认访问者的身份保证安全的访问
2-数据读写:包括数据库部分和缓存部分
3-文件处理:能够对文件上传进行处理
4-易于扩展的接口:比如socket支持,现在用来越多的地方用到了;oauth,网上支付接口等。
1和2是必不可少的。
好了,就这样,我要回去研究php了。