后续:正则模块待学习RegExp
server.js
var connect = require('connect');
var router = require('./middleware/router');
// 其中一些路径中包含带有冒号(:)前缀的标记,代表可以接受用户输入的路径段
var routes = {
GET: {
'/users': function(req, res) {
res.end('tobi, loki, ferret');
},
'/user/:id': function(req, res, id) {
res.end('user ' + id);
}
},
DELETE: {
'/user/:id': function(req, res, id) {
res.end('deleted user ' + id);
}
}
};
connect()
.use(router(routes))
.listen(3000);
router.js
var parse = require('url').parse;
module.exports = function route(obj) {
return function(req, res, next) {
// 检查以确保req.method定义了
// 如果未定义,调用next(),并停止一切后续操作
if (!obj[req.method]) {
next();
return;
}
// 查找req.method对应的路径
var routes = obj[req.method];
// 解析URL,以便跟pathname匹配
var url = parse(req.url);
// 将req.method对应的路径路由存放到数组中
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 + '$');
// 尝试跟pathname匹配
var captures = url.pathname.match(re);
if (captures) {
// 传递被捕获的分组
var args = [req, res].concat(captures.slice(1));
fn.apply(null, args);
// 当有相匹配的函数时,返回,以防止后续的next()调用
return;
}
}
next();
}
};