**此插件包更名为ys-helper，具备的功能如下**

1. 接口助手
    * 支持数据格式统一
    * 支持中间件
2. 异常助手

#调用方式

---
    var ysHelper = require('ys-helper'),
        api1 = ysHelper.apiInit('v1'),
        api2 = ysHelper.apiInit('v2'),
        api3 = ysHelper.apiInit('v3'),
        api4 = ysHelper.apiInit('v4'),
        errors = ysHelper.errors;
    
    ap1.post({
        action: '....',
        param1: '....',
        param2: '....',
    }).then(function(data){
        console.log(data)
    }).catch(errors.ApiError, function(err){
        //可以通过异常类型处理错误
        console.log(err);
    }).catch(function(err){
        console.log(err);
    });
---

#中间件定义
---
    var Promise = require('bluebird');
    var TestMiddleWare = (function() {
      function TestMiddleWare() {}
    
      //定义接口在请求开始前的处理
      TestMiddleWare.prototype.start = function(request) {
        console.log('request start');
        console.log(request.params);
        return Promise.resolve();
      };
      
      //定义接口在数据已处理完成准备请求前的处理
      TestMiddleWare.prototype.afterMakeRequest = function(request) {
        console.log(request.params);
        return Promise.resolve();
      };
    
      //定义接口请求结束后的处理
      TestMiddleWare.prototype.end = function(request) {
        console.log('request end');
        return Promise.resolve();
      };
      
      //定义接口请求异常时的处理
      TestMiddleWare.prototype.error = function(request, err) {
        console.log('request error', err);
        return Promise.resolve();
      };
    
      return TestMiddleWare;
    
    })();
---

#中间件使用
---
    var middlewares = [
        [TestMiddleWare]
    ]
    var api = ysHelper.apiInit(version, middlewares);
---

#为何需要异常助手
1. 分流错误处理，每个控制器的编写再也不需要去考虑我这个异常该怎么处理，那个错误该怎么返回
2. 保持promise格式的优雅，有异常有错误都是直接到catch中，只要一路写then即可

#异常助手说明

1. errors.HttpError -- 接口http访问异常
    * message -- 错误信息
    * version -- api版本
    * action -- 接口名称
2. errors.ApiError -- 接口信息异常
    * message -- 错误信息
    * version -- api版本
    * action -- 接口名称
3. errors.TipsError -- 告知程序此异常可通知于用户
    * message -- 错误信息
    
#异常助手使用栗子

###后端代码
---
    app.post('/getData', function(req, res, next){
        api.post({
            action: 'xxxxx',
            params: 'xxxxx'
        }).then(function(data){
            if(!data.status){
                return Promise.reject(new errors.TipsError(data.msg));
            }
            return api.post({
                action: 'xxxxx',
                params: 'xxxxx'
            });
        }).then(function(data){
            res.json({status: true, data: data});
        }).catch(next);
    });
    
    app.use(function(err, req, res, next){
        if(err instanceof errors.TipsError){
            res.json({status: false, errors: 1, tips: err.message});
        }else if(err instanceof otherError){
            res.json({status: false, errors: 2})
        }else{
            res.status(500).render('error');
        }
    });
---

###前端全局代码
---
    $(document).ajaxError(function(){
        alert('系统繁忙，请稍后重试');
    }).ajaxSuccess(function(event, xhr){
        var data = JSON.parse(xhr.responseText);
        if(!data.status){
            switch(data.errors){
                case 1:
                    alert(data.tips);
                    break;
                case 2:
                    alert(....);
                    break;
                default:
                    ....
            }
        }
    });
---

###前端页面代码
---
    $.post('/getData', {param: 'xxxx'}, function(data){
        if(!data.status) return; //此处直接return，交由全局处理自动处理
        //此处处理正常逻辑，开发人员对于异常/错误提示的处理可以集中在全局，从此精力可完全集中于正常的逻辑处理
    }, 'json');
---


#接口开发说明
**接口最基础的类是api/Tools.coffee，下一层是api/httpHelper.coffee，最终api接口继承httpHelper的Request类**

**Tools.coffee是用来集中api接口处理数据时所需的各种方法**

**httpHelper.coffee是用来程序最终访问http接口的处理，其中make_request是在请求前处理要发送的数据信息，dispose_data用来处理请求后最终返回的数据格式**

**每个api版本继承了Request后，通过重写make_request和dispose_data来处理不同版本间的差异**

**接口约定的返回格式统一为**

---
    {
        status: 'bool', 
        raw: '接口返回的原始数据', 
        data: '开发者可以直接拿来处理的数据', 
        msg: 'status为false的信息'
    }
---