我已经阅读了有关人们路线不匹配的其他问题,然后订购解决问题的路线。我遇到了这个问题,我的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
,请回复一些警告,例如你用少一个参数打电话。我在这里缺少什么?
答案 0 :(得分:3)
默认情况下,快递Url参数不 optinial,这就是
的原因 app.get('/byASIN/LowPrice/:asin/:price',function(req,res){});
与/byASIN/LowPrice/:asin
不匹配,因为缺少第二个参数。
但是,您可以通过向其添加?
使参数成为可选参数:
app.get('/byASIN/LowPrice/:asin/:price?',function(req,res){});
这可以解决你的问题。
答案 1 :(得分:0)
尝试定义/byASIN/LowPrice/:asin/:price
处理的路由,然后使用通配符处理其他所有内容。
app.get('/byASIN/LowPrice/:asin/:price',function(req,res){});
app.get('*',function(req,res){});
答案 2 :(得分:0)
Express按照您插入的顺序匹配路线。如果您首先定义了松散路由,那么express将首先使用该路由作为匹配。一个极端的例子是
app.get('*', function(req, res) {});
如果这被定义为第一条路线,则不会调用其他路线(如果没有调用next())。
如果你想要快递总是首先使用严格的,那么你需要通过在宽松的之前定义严格的路线来改变路线的顺序。
如果在路线中明确支持优先权,那将是很好的,这可能是您的问题的一个很好的解决方案,但不幸的是,这可以通过仅订购来解决:(