首页 > 代码库 > Node路由简单的处理
Node路由简单的处理
看过node很多例子,都是将路由直接放到入口文件中处理,使得文件显得很大很乱,特别是当一个项目变大,有上百甚至上千的路由,那该怎么办?
最近在想如何将一个个的路由放到一个单独的模块中处理,比如‘/users‘对于users模块。根据构想,写了个简单的实现,当然还有很多问题没有考虑到,后面再补充。
目录结构:
项目目录
|-- routers
|-- about.js
|-- contact.js
|-- index.js
|-- router.js
|-- server.js
入口文件:server.js - 创建服务,调用router模块的addRoute方法添加路由。
1 var http = require(‘http‘); 2 var router = require(‘./router‘); 3 4 router.addRoute(‘/‘, require(‘./routers/index‘)); 5 router.addRoute(‘/about‘, require(‘./routers/about‘)); 6 router.addRoute(‘/contact‘, require(‘./routers/contact‘)); 7 8 function onListened(){ 9 console.log(‘Node server starts at 3000.‘);10 }11 12 function onConnected(request, response){13 router.handleRoute(request.url, request, response);14 }15 16 var server = http.createServer(onConnected);17 server.listen(3000, onListened);
4-6行:其实还可以写到router.js中,可以router模块初始化是添加这些路由。这样server.js就又变得干净很多。
router.js - 添加路由,调用路由处理函数
1 var uuid = require(‘node-uuid‘); 2 var http = require(‘http‘); 3 4 function RouterData(route,handler){ 5 this.route = route||‘‘; 6 this.handler = handler||{}; 7 this.id = uuid.v4(); 8 } 9 10 function Router(){11 12 var routers = [];13 var me = this;14 15 this.addRoute = function(route, handler){16 if(!route||!handler) return;17 var routeData = http://www.mamicode.com/new RouterData(route, handler);18 routers.push(routeData);19 };20 21 this.handleRoute = function(route, req, res){22 var handler = getRouteHandlerByRoute(route);23 if(!handler){24 handle_404(route, req, res);25 return;26 }27 handler.exec(route, req, res);28 };29 30 31 function getRouteHandlerByRoute(route){32 var n = routers.length;33 var handler = null;34 for (var i = n - 1; i >= 0; i--) {35 if(routers[i].route === route){36 handler = routers[i].handler;37 break;38 }39 }40 return handler;41 }42 43 function handle_404(route, req, res){44 res.writeHeader(404, {45 ‘Content-Type‘: ‘text/plain‘46 });47 res.end(route+‘ ‘+http.STATUS_CODES[‘404‘]);48 }49 50 }51 module.exports = new Router();
为了简单处理,addRoute方法只是简单的添加了路由,没有考虑到相同的情况,且在getRouteHandlerByRoute函数中的查找路由处理函数的前提是没有相同的路由,否则得用路由uid来查找。
about.js, contact.js, index.js - 实际要处理路由的地方。
1 function About(){ 2 this.exec = function(route, req, res){ 3 res.statusCode = 200; 4 res.setHeader(‘Content-Type‘, ‘text/html‘); 5 res.end(‘This is </b>About Me</b>‘); 6 } 7 } 8 9 10 module.exports = new About();
1 function Contact(){ 2 this.exec = function(route, req, res){ 3 res.statusCode = 200; 4 res.setHeader(‘Content-Type‘, ‘text/html‘); 5 res.end(‘This is </b>Contact Page</b>‘); 6 } 7 } 8 9 10 module.exports = new Contact();
1 function Index(){ 2 this.exec = function(route, req, res){ 3 res.statusCode = 200; 4 res.setHeader(‘Content-Type‘, ‘text/html‘); 5 res.end(‘This is </b><strong>Home Page</strong></b>‘); 6 } 7 } 8 9 10 module.exports = new Index();
在这些模块中都实现了一个exec的方法,用于处理路由。如果更灵活处理,应该可以写一个路由处理的基类,然后再子类继承分别处理。
Node路由简单的处理
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。