文享日志

node路由解析

Nodejs

发表于2017年12月04日01:11:13

0条评论 219次阅读

app.use函数将路径与函数打包进数组

match函数匹配路径,执行相应处理函数

send函数分发请求


当监听到网络请求时,调用send分发函数,找不到路径时,执行404错误函数

var routes = {'all':[]};
var app = {};

//app.use函数作用是将路径与函数打包进数组
app.use = function(path,action){
    routes.all.push([pathRegexp(path),action]);
}

//RESTful设计模式
//即根据请求方式(http请求头)来打包进相应数组
['get','put','delete','post'].forEach(function(method){
    app[method] = function(path,action){
        routes[method] = [] ;
        app[method] = function(path,action){
            routes[method].push([pathRegexp(path),action]);
        }
    }
})

//实现功能
//匹配类似/path/:user =>/path/han , /path/li
//或者匹配/user.:ext => /user.xml , /user.json
var pathRegexp = function(path){
    //code
    return {
        keys : keys,
        regexp : new RegExp('^'+path+'$');
    };
}

//为请求路径查找相应处理函数
var match = function(pathname , routes){
    for (var i = 0; i < routes.length; i++) {
        var route = routes[i];
        var reg = route[0].regexp ; 
        var keys = route[0].keys;
        var matched = reg.exec(pathname);
        if (matched) {
            var params = {};
            for (var i = 0,1 = keys.length; i < 1; i++) {
                var value = method[i+1];
                if(value){
                    params[keys[i]] = value;
                }
            }
            req.params = params ;
            var action = route[1];
            action(req,res);
            return true;            
        }
    }
    return false;
}

//分发函数
var send = function(req,res){
    var pathname = url.parse(req.url).pathname;
    var method = req.method.toLowerCase();
    //让相应的请求方式函数处理
    if (routes.hasOwnPerperty(method)) {
        if (match(pathname,routes[method])) {
            return;
        }else{
            if (match(pathname,routes.all)) {
                return;
            }
        }        
    }else{
        if (match(pathname,routes.all)) {
            return;
        }        
    }
    handle404(req,res);
}

参考来源:

《Nodejs深入浅出》

👍 0  👎 0
共有0条评论

发表新评论

提交

广告展示

腾讯云推广 阿里云推广