DoraCMS

您现在的位置是:首页>文档内容页

文档详情

第五天——范式路由之更新后的代码

doramart 2015-10-05 09:34:49 NodeJs224852
lib/pathRegexp.js最新代码

更新后的代码

lib/pathRegexp.js最新代码

module.exports = pathRegexp;
function pathRegexp(path) {

    var paramNames = [];

    path = path

        // 这个方法用把 * 替换成正则表达式的 [0-9a-zA-Z\-_]* 形式。
        .replace(/((\*{1}(?=\/))|(\*{1}(?=$)))/g, "[0-9a-zA-Z\-_]*")

        // 这个方法是把 :xxx 的形式替换成  [0-9a-zA-Z\-_]*  正则表达式形式。
        .replace(/(:(.*?(?=\/)))|(:(.*?(?=$)))/g, "[0-9a-zA-Z\-_]*")

        // 把 /article/:id/ 的转换为 /article/:id
        .replace(/\/$/g, "")

        // 把 / 转换为 \/ ,因为这是字符串形式,最后通过 new RegExp(path)
        // 生成时,必须要经过这个转换。
        .replace(/\//g, "\\\/")

    var regexp = new RegExp("^" + path + "\\/?$");
    regexp.paramNames = paramNames;
    return regexp;
}

lib/App.js最新代码

var http = require("http")
   ,pathRegexp = require("./pathRegexp")
   ,url = require("url");

module.exports = App;

function App(){
    // 插件有序列表
    var middleList = this._middleList = [];

    var self = this;

    this._route_post_handles = [] //最新修改

    this._route_get_handles = [] //最新修改

    // request事件响应函数
    function handle(req,res){

        // 循环执行插件
        var middleIndex = 0; // 插件索引

        execMiddle();

        // 执行这个函数时,会自动执行下一个middle插件。
        // 至于这个函数的执行,是由插件所控制。
        function next(){
            middleIndex += 1;
            execMiddle();
        }

        // 执行插件函数
        function execMiddle(){
            var middle = middleList[middleIndex];
            if(middle){
                middle(req,res,next);
            }else{
               var handle;

               // 把 /abc?age=12 转为 /abc
               var path = url.parse(req.url).pathname;  //最新修改

               // 找到路由对应的路由处理器。
               function findHandle(route_handles){ //最新修改
                    for(var i=0,len=route_handles.length; i<len ; i++){
                        var route_handle = route_handles[i];
                        var pass = route_handle.route.test(path);
                        if(pass){
                            handle = route_handle.handle;
                            break;
                        }
                    }    
               }

               // 判断是GET还是POST方法
               switch(req.method){
                     case "GET":
                         // handle = self._route_get_handles[req.url]
                         findHandle(self._route_get_handles); //最新修改
                     break;
                     case "POST":
                         // handle = self._route_post_handles[req.url]
                         findHandle(self._route_post_handles); //最新修改
                     break;
               }

               if(handle){
                   handle(req,res);
               }else{
                   // 没找到指定处理器,返回404
                   res.statusCode = 404; //最新修改
                   res.end(); //最新修改
               }
            }
        }        

    }

    this._server = http.createServer(handle);

}

// 加入功能栈
App.prototype.use = function(middle){
    this._middleList.push(middle);
}

App.prototype.get = function(route,handle){ //最新修改
    this._route_get_handles.push({route:pathRegexp(route),handle:handle})
}

App.prototype.post = function(route,handle){ //最新修改
    this._route_post_handles.push({route:pathRegexp(route),handle:handle})
}

// 监听端口
App.prototype.listen = function(){
    this._server.listen.apply(this._server,arguments);
}

下一节,将做一个使用例子,并演示效果其效果。

文章评论

Cancel the reply
Login Participate In Comments

Review(