为框架增加新特性

首先,更改App的构造函数,增加两个处理函数的变量名,用于储存处理函数。

......
function App(){

    var self  =  this;

    // DOTO ,  GET方法的处理函数
    this._getHandle = null;

    // DOTO ,  POST方法的处理函数
    this._postHandle = null;

    ......

接下来,为App原型增加两个方法,目的是设置GET方法与POST方法请求的处理函数。

......
App.prototype.get = function(handle){
    this._getHandle = handle;
}

App.prototype.post = function(handle){
    this._postHandle  = handle;
}
......

通过以上两步,还是无法真正起到作用,还需要修改App构造函数内部的handle函数。目的,是让中间件执行完成后,再执行GET或POST的处理函数。

下图演示了中间件和处理函数的顺序。


brighthas-gJM-yGJize.png


根据上图所示,需要在中间件依次执行后,进行个判断,看看request.method 是 POST还是GET 方法,最后调用对应的处理函数。下面是修改后的代码片段。

function App(){
     ......
     function handle(){
        ......
            // 执行插件函数
            function execMiddle(){
                var middle = middleList[middleIndex];
                if(middle){
                    middle(req,res,next);
                }else{
                   // 判断是GET还是POST方法
                   switch(req.method){
                         case "GET":
                               if(self._getHandle){
                                     self._getHandle(req,res);
                               }
                         break;
                         case "POST":
                                if(self._postHandle){
                                      self._postHandle(req,res);
                                }
                         break;
                   }                          
                }
            }            
        ......         
     }
     ......
}

另外,static.js中间件,还需要修改一下,因为必须让它调用next(),否则如果程序加入了static中间件,get和post方法的处理函数永远都不会被调用。而static中间件要在找不到静态资源的时候调用next(),比如/page.html能找到,那么就直接返回这个静态资源,如果找不到,就next()交给下一个中间件,或get/post方法处理函数去处理。

下面对static.js中间件代码进行修改。

module.exports = function static(parent_path){

    return function(req,res,next){ 
       var path = url2path(req.url);
       function callback(err,data){
             if(err){
                 // res.statusCode = 404;
                 // 如果找不到资源,直接next()
                 next();
             }
             else{
                res.write(data);
                res.end();  
             }
       }
       fs.readFile(parent_path+path,callback);
    }

}

下一节,对新特性进行效果演示。