2016-08-15 34 views
0

更高优先级的我有两条路线在这个顺序添加:请在快递的具体路由具有比动态的

/:foo 
/login 

的方式我的应用程序是如何构成的是,路由可以动态地添加。所以,我想捕捉任何网站页面(例如/hello-world,通过:foo匹配的),但我确实希望,具体路线/login比另一个具有更高的优先级。

我知道了中间件,顺序得到执行,因此,最好我不得不改变调用的顺序,但因为这是动态发生的事情,有没有更好的办法做到这一点?

我怎么能告诉快递,没有动态的东西,在他们的路线(几乎包含:)应在是动态的那些具有优先权?

+0

如果设置了这个样子,/登录匹配/路由器:FOO反正 –

+0

@LukasHechenberger这之前就是我刚才说的问题。 ':D' –

回答

1

我不认为这是可能的“普通”快,但是这可能工作:

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.Routerhandle方法排序处理请求之前的层堆栈(包含路由)。它排序在路径基于路径的长度(较长的路径优先)的路线,并会有限制参数以具有长度l(所以/:foo具有2的长度,和/具有1的长度;如果有这样的路径/x,你可能不得不解决这个问题)。

非常多的未经检验的,但至少可以提供关于如何解决这一点的想法。

+0

谢谢!说得通。我最终只是通过检查URL中是否存在':',并且因为我正在调用自己的函数来添加新路由,如果URL中包含':',我将它添加到路由器对象中,否则我将其添加到另一个路由器对象。最后一个优先。 :) –

+0

@IonicăBizău你的听起来像一个更清洁的解决方案比我的黑客= D – robertklep

1

您应该放置一条优先级高于其他优先级的路由。

app.get('/login', (req, res) => { 
    res.send('login'); 
}); 
app.get('/:foo', (req, res) => { 
    res.send('fooooo'); 
}); 

然后它会工作