carcass 快速创建api server 的另一种选择

carcass 框架是构建在express connect等模块上的一个restfull api 框架,封装了诸如 deferred等一些非常有用的框架,下面介绍如何使用carcass来快速建立一个node api server。

0.扩展

carcass包含有几个很重要的特性

mixable与mixin

例如

var obj = {};  
carcass.mixable(obj);  
obj.mixin({  
     start: function() {  
     }  
})  

mixable给一个对象添加mixin方法
mixin类似于一个扩展继承的概念

register
obj.mixin(carcass.proto.register);  
obj.register(path.resolve(__dirname, 'lib'));  

通过register 我们就可以通过obj的属性来引用lib文件下的文件

deferred

deferred 是JavaScript异步变同步的框架,将每步操作变成一个promise.

var deferred = carcass.deferred;  
function save() {  
    var def = deferred;  
    /*  
     *Do something then resolve or reject.  
     */  
    return def.promise;  
}  

具体使用方法可以看deferred的文档.

1.结构
carcass 主要的特性就是帮助开发者有效的控制项目的结构,所以引入了一个很重要的特性

carcass.register  

对于我自己来说一个应用的结构可能会像这样的

|--api  
|   |--applications  
|   |   |--auth.js  
|   |   |--user.js  
|   |   |--...  
|   |--lib  
|   |   |--utils.js  
|   |--index.js  
|   
|--auth  
|   |--lib  
|   |   |--auth.js  
|   |   |--user.js  
|   |--test  
|   |   |--...  
|   |--index.js  
|   |--Makefile     
|--index.js  
.....  

如何快速得到api内的各个独立的api
一般的做法是类似这种

{  
  var api = module.exports= {  
      auth: require('applications/auth'),  
      user: require('applications/user')  
  }  
}  

使用carcass.register 我们就可以很简单的使用去export 一个api对象

var path = require('path');  
var carcass = require('carcass');  

var api = module.exports = carcass.mixable({  
    registerOptions: {  
        noRecursive: true,  
        noIndex: true  
    }  
});  

api.mixin(carcass.proto.register);  
api.register(path.resolve(__dirname, 'applications'));  
</pre>`  
很方便的直接可以使用api.auth 或者api.user ,而且以后增删文件 无需更改index.js  
如果有子文件夹还可以使用api.sub.sub.js这种格式,只要将noRecursive移出即可  
注:   
    carcass 内部是通过文件的路径来添加属性的  
    noRecursive 是否遍历子文件夹  
    noIndex 是否包含index.js  

2.代码  
写一个user的api  
在root/api/applications/ 目录下添加一个user.js  
<pre>`  
var carcass = require('carcass');  
var app = module.exports = carcass.express();  

app.get('/', function(req, res, next) {  
    return res.json(200, {hi: 'carcass'});  
});  

app.get('/:id', function(req, res, next) {  
    return res.json(200, {id: req.params.id});  
});  

app.get('/test', function(req, res, next) {  
    return next(carcass.httpError(501));  
});  

和express 的api书写方式一样
在root/ 下添加一个index.js

var http = require('http');  
var carcass = require('carcass');  
var app = carcass.express();  
var api = require('./api');  

app.use('/user', api.user);  

http.createServer(app).listen(3000);  

运行node index.js 访问http://127.0.0.1:3000/user会返回 {hi: 'carcass'}
一个简单的api server 就搭建成功了