1 编写路由器
除了直接使用现成的router包,我们其实也可以自己试着编写路由器。
首先我们要规划好路由规则。比如当用户获取/users路径时,返回 tobi, loli, ferret数据。当用户获取/users/:id路径时,返回 user + id.
好了,开始写代码吧。首先 建立myRouter文件夹,然后新建javascript文件,取名server-bad.js。
var connect = require('connect'),
parse = require('url').parse;
var userRoutes = {
GET : {
'/users' : function (req,res){
res.end('tobi,loki,ferret');
},
'/users/:id' : function(req,res,id){
res.end('user ' + id);
}
},
DELETE: {}
};
我们将路由规则定义在userRoutes对象中。可以看到我们定义了两条路由规则 1 /users, 2 /users/:id 他们支持HTTP的GET方法。
然后开始编写路由器
function router(obj) {
return function(req,res,next) {
if(!obj[req.method]){
next();
return;
}
var routes = obj[req.method];
var url = parse(req.url);
var paths = Object.keys(routes);
for(var i=0;i<paths.length;i++) {
var path = paths[i];
var fn = routes[path];
path = path.replace(/\//g,'\\/').replace(/:(\w+)/g,'([^\\/]+)');
var re = new RegExp('^' + path + '$');
var captures = url.pathname.match(re);
if(captures) {
var args = [req,res].concat(captures.slice(1));
fn.apply(null,args);
return;
}
}
next();
}
};
可以看到,只需要向我们的路由器中传入相应的路由规则,我们的路由器就能工作起来。
最后,为服务器打开端口
connect().use(router(userRoutes))
.listen(3000);
这时,在浏览器里访问http://localhost:3000/users 或者 http://localhost:3000/users/1234,就得到想要的结果了。
如果我们想要加入admin的路由规则呢?按照现在的思路好像很简单,在代码里在写一个adminRoute对象,加入相应规则即可。随着业务的发展,我们又要加入别的路由规则,如果我们所有的代码都在一个文件里面,那么以后维护和理解的难度都会大大增加。所以还是将代码模块化。
2 最佳实践
我们的代码结构如下:
myRouter -----
middleware ---------
routers.js
node_modules
routes-------------------
admin
Users
package.json
server.js
首先看路由规则模块users/user.js:
module.exports = {
GET : {
'/users' : function (req,res){
res.end('tobi,loki,ferret');
},
'/users/:id' : function(req,res,id){
res.end('user ' + id);
}
},
DELETE: {}
}
然后是路由器模块middleware/routers.js
var parse = require('url').parse;
module.exports = function (obj) {
return function(req,res,next) {
if(!obj[req.method]){
next();
return;
}
var routes = obj[req.method];
var url = parse(req.url);
var paths = Object.keys(routes);
for(var i=0;i<paths.length;i++) {
var path = paths[i];
var fn = routes[path];
path = path.replace(/\//g,'\\/').replace(/:(\w+)/g,'([^\\/]+)');
var re = new RegExp('^' + path + '$');
var captures = url.pathname.match(re);
if(captures) {
var args = [req,res].concat(captures.slice(1));
fn.apply(null,args);
return;
}
}
next();
}
};
最后是server.js
var connect = require('connect'),
router = require('./middleware/routers');
connect().use(router(require('./routes/user/user')))
.listen(3000);
源代码 如果不能下载,请在csdn搜索“在connect中编写自己的路由器及最佳实践”