【问题标题】:Express route wrong match快递路线错误匹配
【发布时间】:2016-08-20 13:16:15
【问题描述】:

我已阅读有关人们路线不匹配的其他问题,然后对解决问题的路线进行排序。我遇到了这个问题,我的 URL 路由被视为参数,然后表达不匹配并导致错误的路由。例如这是两条路线:

app.get('/byASIN/LowPrice/:asin/:price',function(req,res){});

app.get('/byASIN/:asin/:price', function(req, res) {});

现在一切正常,但只要我从第一条路线中取出任何参数,它就会匹配下面给出的路线,这不是我想要的。 如果我点击/byASIN/LowPrice/:asin/:price,一切正常,但只要我点击/byASIN/LowPrice/:asin,它就会匹配byASIN/:asin/:price,因此调用错误的函数并使我的服务器崩溃。我想让它们明确匹配,如果调用/byASIN/LowPrice/:asin,请以一些警告作为响应,例如你打电话少了一个论点。我在这里错过了什么?

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    默认情况下 express Url 参数是不是可选的,这就是为什么

    app.get('/byASIN/LowPrice/:asin/:price',function(req,res){});

    不匹配/byASIN/LowPrice/:asin,因为缺少第二个参数。

    但是,您可以通过向其添加 ?将参数设为可选

    app.get('/byASIN/LowPrice/:asin/:price?',function(req,res){});

    这应该可以解决您的问题。

    【讨论】:

    • 我不想让它成为可选的,我只是想让路由器严格匹配。 IMO /byASIN/LowPrice//byASIN/:asin/ 完全不同,我希望匹配严格,如果缺少参数,发出警告,指出参数丢失,而不是让它移动到下一个完全不同的路线
    【解决方案2】:

    尝试为/byASIN/LowPrice/:asin/:price 定义一个路由来处理,然后使用通配符来处理其他所有事情。

    app.get('/byASIN/LowPrice/:asin/:price',function(req,res){});
    
    app.get('*',function(req,res){});
    

    【讨论】:

    • 对不起,我不明白这一点。就像byASIN/:asin/:price 我还有很多其他路线可以匹配。我认为它正在做的是,首先它检查顶部是否匹配,即使/LowPrice/:asin 匹配但参数的数量不匹配,所以它移动到byASIN/:asin/:price,因为它也将/LowPrice 作为参数,因此使总共有 3 个参数是错误的
    【解决方案3】:

    Express 按您插入的顺序匹配路线。如果您首先定义了松散的路由,那么 express 将首先使用该路由作为匹配项。一个极端的例子是

    app.get('*', function(req, res) {});
    

    如果这被定义为第一个路由,则不会调用其他路由(如果没有调用 next())。

    如果您希望 express 始终首先使用严格的,那么您需要通过在松散的之前定义严格的来更改路由的顺序。

    如果在路线中明确支持优先级会很好,这可能是解决您问题的好方法,但不幸的是,在此之前,这可以通过仅订购来解决:(

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多