[英]Make the specific routes in Express have higher priority than the dynamic ones
我按此順序添加了兩條路線:
/:foo
/login
我的應用程序結構的方式是可以動態添加路由。 所以,我確實希望捕獲任何網站頁面(例如/hello-world
,匹配:foo
),但我確實希望特定路由/login
具有比另一個更高的優先級。
我知道中間件按順序執行,所以,理想情況下我必須改變調用的順序,但由於這是動態發生的,有沒有更好的方法呢?
我怎么能告訴快遞,沒有動態的東西,在他們的路線(幾乎包括:
)應在是動態的那些具有優先權?
您應該盡早放置優先級高於其他路線的路線。
app.get('/login', (req, res) => {
res.send('login');
});
app.get('/:foo', (req, res) => {
res.send('fooooo');
});
然后它會工作
我不認為使用“普通”Express可以實現,但這可能有效:
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;
它基本上是monkeypatch express.Router
的handle
方法,用於在處理請求之前對層堆棧(包含路由)進行排序。 它根據路徑的長度(較長的路徑優先)對路由進行排序,路徑中的硬編碼參數的長度為1(因此/:foo
的長度為2,並且/
的長度為1;如果有的話像/x
這樣的路徑,你可能需要解決這個問題)。
非常未經測試,但至少可以提供一個如何解決這個問題的想法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.