Connect中间件——路由中间件

后续:正则模块待学习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();
	}
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值