在弄清楚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;
先不说内容怎么样。。难道就真的不会用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 我有篇文章讲到了我做过的一个项目的架构
新手看不懂这代码是什么意思,还是喜欢一个一个写路由,扩展性好