给初学者 - 一个实现数据库增删改查的路由方式,可应用于多模块的复杂应用系统
发布于 2年前 作者 nodefan01 1149 次浏览

在弄清楚javascript和node.js原理前,一上来就用各种大型框架,初学者会走很多弯路。 比如session管理,写个session类,用内存来管理,一般就足够应用了 - 不过本贴不涉及这块。

//app.js --非常简单 var http=require(‘http’) ,path=require(‘path’) ,fs=require(‘fs’) ,route=require(‘./route.js’) ;

var session=new (require(‘./session’))();

http.createServer(function(request,response){ route(request,response,session);

}).listen(3000);

//session.js function session(){ var sessions=[]; this.signIn(…){…} this.signOut(…){…} this.isInSession(…){…} } 下面推荐的是一种路由方式,仅供参考。

//route.js module.exports=function(req,res,session){ switch(req.url){ case '/signin’: //主页 错误页面 登入登出等 … break; case '/signout’: … break; case /file#…: returnFile(req,res,session); … break;

default:
  returnData(req,res,session);
  break;

}

}

//用来处理文件请求

function returnFile(req,res){ … *html, images, css, *.js… }

function returnData(req,res){ if(session.isInSession(req){ //检查是否登录(或者检查用户是否在权限范围内的类) var sql_json=JSON.parse(querystring.parse(url.parse(req.url).query)[‘q’]); routes[sql_json.m][sql_json.a](sql_json.v,function(err,data){ …

});

}else{
… }

} var routes={ "module1":{ "action1":function(v,cb){require(‘module1.js’).fn_a(v,cb);} "action2":function(v,cb){require(‘module1.js’).fn_b(v,cb);} } ,"module2":{ "action1":function(v,cb){require(‘module2.js’).fn_a(v,cb);} "action2":function(v,cb){require(‘module2.js’).fn_b(v,cb);} } … }

//module1.js 实现数据增删改查及业务逻辑的模块 var mysql=require(‘…’); function fn_a(v,cb){…cb();} function fn_b(v,cb){…cb();} exports.fn_a=fn_a; exports.fn_b=fn_b;

8 回复

先不说内容怎么样。。难道就真的不会用Markdown?

#一个简单的路由


本方法通过简单的路由定义,实现复杂的业务逻辑。 路由定义如下:

var routes={
  "module1":{  //模块
        "action1":function(v,cb){require('module1.js').fn_a(v,cb);}   //引用功能模块1的操作1
        ,"action2":function(v,cb){require('module1.js').fn_b(v,cb);}   //引用功能模块1的操作2        
        }
    ,"module2":{  //模块
        "action1":function(v,cb){require('module2.js').fn_a(v,cb);}   //引用功能模块2的操作1
        ,"action2":function(v,cb){require('module2.js').fn_b(v,cb);}   //引用功能模块2的操作2        
        }       
};

客户端ajax发送请求的url定义如下:

var v={
    "m":"module1"
    ,"a":"action1"
    ,"v":{...}//发往服务器端的复杂的数据结构,根据业务需求而定
};
var url='query?q='+JSON.strignify(v});

服务器端url解析如下:

    var querystring=require('querystring')
    ,url=require('url');
    var sql_json=JSON.parse(querystring.parse(url.parse(req.url).query)['q']); 

调用路由:

routes[sql_json.m][sql_json.a](sql_json.v,function(err,data){
    ...
    }); 

下面为稍详细的代码


#服务器端

###app.js

var http=require('http')
,path=require('path')
,fs=require('fs')
,route=require('./routes/route.js');

var session=new (require('./session'))();

http.createServer(function(request,response){
route(request,response,session);
}).listen(3000);

###session.js --通过内存管理session的类 function session(){ var sessions=[]; this.isInSession=function(req){…} this.signIn=function(req){} this.signOut=function(req){} //从header里提取cookie信息
function objectifyCookie(req){ … return u_id;} } } ##route.js
var querystring=require(‘querystring’) ,url=require(‘url’); module.exports=function(req,res,session){ switch(req.url){ case ‘/’: returnFile(‘index’,res); break; case ‘/signin’: session.signIn(req,res); break; case ‘/signout’: session.signOut(req,res); break; default: returnData(req,res,session); break;
}
} function returnData(req,res,session){ if(!session.isInSession(req)){return …;}
var sql_json=JSON.parse(querystring.parse(url.parse(req.url).query)[‘q’]);
routes[sql_json.m][sql_json.a](sql_json.v,function(err,data){ … }); } var routes={ "module1":{ "action1":function(v,cb){(require(‘./module1.js’).fn_a(v,cb);} ,"action2":function(v,cb){(require(‘./module1.js’).fn_b(v,cb);}
} ,"module2":{ "action3":function(v,cb){(require(‘./module2.js’).fn_c(v,cb);}
,"action4":function(v,cb){(require(‘./module2.js’).fn_d(v,cb);} } }; function returFile(…){…} ##module1.js --负责具体业务逻辑的模块 //具体业务功能模块//module1.js //引用node-mysql及其设置 var mysql=require(…);

function fn_a(v,cb){...}
function fn_b(v,cb){...}
exports.fn_a=fn_a;
exports.fn_b=fn_b;

//module2.js
var mysql=require(...);
function fn_c(v,cb){...}
function fn_d(v,cb){...}
exports.fn_c=fn_c;
exports.fn_d=fn_d;

##客户端

ajax函数

function queryData(v,cb,isPost){
    var url=’query?q=’+JSON.strignify(v);
    var req=new XMLHttpRequest();
    req.onreadystatechange=function(){
        if(req.readyState==4 && req.status==200){
            if(JSON.parse(req.responseText).msg=='not login'){
                renderSignIn();
        } else{
            return cb(null,req.responseText);
        }
    }
    } ;
    if(isPost){req.open('post',url,false);}else{req.open('get',url,false);}
    req.send(null);
}

###调用ajax var v={ “m”:”module1" //此处可使用简单的模块别称或者序号 ,”a”:”query”//此处可使用简单的操作别称或者序号 ,”v”:{…} // 此处可根据业务逻辑定义复杂的数据结构 }; queryData(v,function(err,data){ var _data=JSON.parse(data); //获得服务器传来对象 … });

感觉太复杂了,我只用了几行代码就自动路由了

求示范,观摩一下

这代码也太那个撒了吧哈哈

请分享,谢谢!

@hexie 我有篇文章讲到了我做过的一个项目的架构

新手看不懂这代码是什么意思,还是喜欢一个一个写路由,扩展性好

回到顶部