NodeJS学习笔记: RESTful —— 为本系列做个小结

520 查看

前言

本人不是技术专家,该笔记只是从使用语言进行开发的层面上记录一些体会,不包含也不想尝试从源码或者更深的层次去讨论语言本身的优劣。文章内容是笔者的个人感悟,既不保证正确性,也不保证别人能看懂。

这是该笔记的第三篇,用来对最近的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了。