【问题标题】:Express routes parameter conditions快递路线参数条件
【发布时间】:2012-06-30 18:54:22
【问题描述】:

我的 Express 应用上有一条如下所示的路线:

app.get('/:id', function (request, response) {
  …
});

ID 始终是一个数字。但是,目前这条路线正在匹配其他东西,例如/login

我想我想从中得到两件事:

  1. 仅当 ID 为数字时才使用此路由,并且
  2. 仅当没有为该特定参数定义路由时(例如与/login 冲突)。

这个可以吗?

【问题讨论】:

    标签: node.js express routing url-routing


    【解决方案1】:

    是的,请查看 http://expressjs.com/guide/routing.htmlhttps://www.npmjs.com/package/path-to-regexp(快递使用)。一个可能工作的未经测试的版本是:

    app.get(/^(\d+)$/, function (request, response) {
      var id = request.params[0];
      ...
    });
    

    【讨论】:

      【解决方案2】:

      扩展 Marius 的答案,您可以提供正则表达式和参数名称:

      app.get('/:id(\\d+)/', function (req, res){
        // req.params.id is now defined here for you
      });
      

      【讨论】:

      • 很好,但现在如果我有一条路线可以在其他地方使用/1,它仍然会调用它。无论如何要防止这种情况发生?
      • 只要明确的/1 路由首先添加,它将优先。
      • 您可以先放置显式路由,正如 JohnnyHK 所说。您还可以将 RegEx 定义为不匹配您要跳过的路线。
      • 按优先级排序您的路由处理程序,然后使用function(req, res, next),当您的逻辑知道它需要将控制权传递给行中的下一个路由处理程序时,从任何路由中调用 next()。跨度>
      • 如果您使用像 Mongo ObjectID 这样的字母数字 id,您将需要更改正则表达式
      【解决方案3】:

      你可以使用:

      // /12345
      app.get(/\/([^\/]+)\/?/, function(req, res){
        var id = req.params[0];
        // do something
      });
      

      或者这个:

      // /post/12345
      app.get(/\/post\/([^\/]+)\/?/, function(req, res){
        var id = req.params[0];
        // do something
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-01-12
        • 1970-01-01
        • 1970-01-01
        • 2016-04-22
        • 2021-07-28
        • 2016-06-15
        相关资源
        最近更新 更多