DoraCMS

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

文档详情

第6天 路由功能——更新后的代码

doramart 2015-10-16 15:33:24 NodeJs225296
路由功能更新后的代码,包括了lib/query.js,lib/pathRegexp.js和​App.js

更新后的代码

以下是今天更新后的代码。

lib/query.js 代码

var url = require("url"),
    qs = require("querystring");

function query(req,res,next){
    var querystring = url.parse(req.url).query; // 请求参数部分
    // 判断是否有参数
    if(querystring){
        var queryObj = qs.parse(querystring);  // 转换为json格式
        req.query = queryObj;  // 赋值
    }

    next();
}

module.exports = query;

lib/pathRegexp.js代码

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

    var paramNames = [];

    path = path
        .replace(/((\*{1}(?=\/))|(\*{1}(?=$)))/g, "[0-9a-zA-Z\-_]*")
        .replace(/(:(.*?(?=\/)))|(:(.*?(?=$)))/g,function () {

            var len = arguments.length - 3;
            for (var i = 0; i < len; i++) {
                var avg = arguments[i + 1];
                if (typeof avg === "string" && avg[0] !== ":") {
                    paramNames.push(avg);
                }
            }
            return "([0-9a-zA-Z\-_]*)"

        })
        .replace(/\/$/g, "")
        .replace(/\//g, "\\\/")

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

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){

        req.params = {};

        // 循环执行插件
        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){
                            route_handle.route.paramNames.forEach(function(name,index){
                                req.params[name] = RegExp["$"+(index+1)];
                            })
                            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(