我不认为这是可能的“普通”快,但是这可能工作:
let Router = express.Router;
let MyRouter = function() {
let instance = Router.apply(this, arguments);
let handle = instance.handle.bind(instance);
instance.handle = function(req, res, out) {
this.stack.sort((layer1, layer2) => {
let path1 = layer1.route.path.replace(/:[A-Za-z0-9_]+/g, ':');
let path2 = layer2.route.path.replace(/:[A-Za-z0-9_]+/g, ':');
return path1.length < path2.length;
});
return handle(req, res, out);
};
return instance;
}
express.Router = MyRouter;
它基本上monkeypatches的express.Router
的handle
方法排序处理请求之前的层堆栈(包含路由)。它排序在路径基于路径的长度(较长的路径优先)的路线,并会有限制参数以具有长度l(所以/:foo
具有2的长度,和/
具有1的长度;如果有这样的路径/x
,你可能不得不解决这个问题)。
非常多的未经检验的,但至少可以提供关于如何解决这一点的想法。
如果设置了这个样子,/登录匹配/路由器:FOO反正 –
@LukasHechenberger这之前就是我刚才说的问题。 ':D' –