在弄清楚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?
#一个简单的路由
本方法通过简单的路由定义,实现复杂的业务逻辑。 路由定义如下:
客户端ajax发送请求的url定义如下:
服务器端url解析如下:
调用路由:
下面为稍详细的代码
#服务器端
###app.js
###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(…);
##客户端
ajax函数
###调用ajax var v={ “m”:”module1" //此处可使用简单的模块别称或者序号 ,”a”:”query”//此处可使用简单的操作别称或者序号 ,”v”:{…} // 此处可根据业务逻辑定义复杂的数据结构 }; queryData(v,function(err,data){ var _data=JSON.parse(data); //获得服务器传来对象 … });
感觉太复杂了,我只用了几行代码就自动路由了
求示范,观摩一下
这代码也太那个撒了吧哈哈
请分享,谢谢!
@hexie 我有篇文章讲到了我做过的一个项目的架构
新手看不懂这代码是什么意思,还是喜欢一个一个写路由,扩展性好