Node路由简单的处理

看过node很多例子,都是将路由直接放到入口文件中处理,使得文件显得很大很乱,特别是当一个项目变大,有上百甚至上千的路由,那该怎么办?

最近在想如何将一个个的路由放到一个单独的模块中处理,比如'/users'对于users模块。根据构想,写了个简单的实现,当然还有很多问题没有考虑到,后面再补充。

目录结构:

  项目目录

    |-- routers

      |-- about.js

      |-- contact.js

      |-- index.js

    |-- router.js

    |-- server.js

入口文件:server.js - 创建服务,调用router模块的addRoute方法添加路由。

 var http = require('http');
var router = require('./router'); router.addRoute('/', require('./routers/index'));
router.addRoute('/about', require('./routers/about'));
router.addRoute('/contact', require('./routers/contact')); function onListened(){
console.log('Node server starts at 3000.');
} function onConnected(request, response){
router.handleRoute(request.url, request, response);
} var server = http.createServer(onConnected);
server.listen(3000, onListened);

4-6行:其实还可以写到router.js中,可以router模块初始化是添加这些路由。这样server.js就又变得干净很多。

router.js - 添加路由,调用路由处理函数

 var uuid = require('node-uuid');
var http = require('http'); function RouterData(route,handler){
this.route = route||'';
this.handler = handler||{};
this.id = uuid.v4();
} function Router(){ var routers = [];
var me = this; this.addRoute = function(route, handler){
if(!route||!handler) return;
var routeData = new RouterData(route, handler);
routers.push(routeData);
}; this.handleRoute = function(route, req, res){
var handler = getRouteHandlerByRoute(route);
if(!handler){
handle_404(route, req, res);
return;
}
handler.exec(route, req, res);
}; function getRouteHandlerByRoute(route){
var n = routers.length;
var handler = null;
for (var i = n - 1; i >= 0; i--) {
if(routers[i].route === route){
handler = routers[i].handler;
break;
}
}
return handler;
} function handle_404(route, req, res){
res.writeHeader(404, {
'Content-Type': 'text/plain'
});
res.end(route+' '+http.STATUS_CODES['404']);
} }
module.exports = new Router();

为了简单处理,addRoute方法只是简单的添加了路由,没有考虑到相同的情况,且在getRouteHandlerByRoute函数中的查找路由处理函数的前提是没有相同的路由,否则得用路由uid来查找。

about.js, contact.js, index.js - 实际要处理路由的地方。

 function About(){
this.exec = function(route, req, res){
res.statusCode = 200;
res.setHeader('Content-Type', 'text/html');
res.end('This is </b>About Me</b>');
}
} module.exports = new About();
 function Contact(){
this.exec = function(route, req, res){
res.statusCode = 200;
res.setHeader('Content-Type', 'text/html');
res.end('This is </b>Contact Page</b>');
}
} module.exports = new Contact();
 function Index(){
this.exec = function(route, req, res){
res.statusCode = 200;
res.setHeader('Content-Type', 'text/html');
res.end('This is </b><strong>Home Page</strong></b>');
}
} module.exports = new Index();

在这些模块中都实现了一个exec的方法,用于处理路由。如果更灵活处理,应该可以写一个路由处理的基类,然后再子类继承分别处理。

上一篇:使用Jmeter录制web脚本


下一篇:K均值聚类