簡體   English   中英

使Express中的特定路由優先於動態路由

[英]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.Routerhandle方法,用於在處理請求之前對層堆棧(包含路由)進行排序。 它根據路徑的長度(較長的路徑優先)對路由進行排序,路徑中的硬編碼參數的長度為1(因此/:foo的長度為2,並且/的長度為1;如果有的話像/x這樣的路徑,你可能需要解決這個問題)。

非常未經測試,但至少可以提供一個如何解決這個問題的想法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM