2016-04-26 79 views
3

我已经阅读了关于人员路线不匹配的其他问题,然后订购解决问题的路线。我有这个问题,我的URL路由被视为一个参数,然后表达不匹配,导致错误的路线。例如这里有两条路线:快速路线错误匹配

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

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

现在所有工作正常,但只要我采取任何PARAM出了第一条路线的它符合以下其中给出的路径是不是我想要的。 如果我点击/byASIN/LowPrice/:asin/:price一切正常,但只要我点击/byASIN/LowPrice/:asin它匹配byASIN/:asin/:price,因此调用错误的函数并崩溃我的服务器。我希望让它们明确匹配,并且如果调用/byASIN/LowPrice/:asin,则会响应一些警告,例如,你只需要少一个参数即可。我在这里错过了什么?

回答

3

默认快递地址参数 optinial,这就是为什么

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

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

但是你可以做参数可选通过添加?它:

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

这应该解决您的问题。

+0

我不想固定为了使它成为可选的,我只想让路由器严格匹配,IMO'/ byASIN/LowPrice /'与'/ byASIN /:asin /'是世界不同的,我希望这个匹配是严格的,如果有一个param缺失的问题一个警告,该参数丢失,而不是它移动到下一个完全不同的路线 – user3677331

+0

这个答案增加了洞察力http://stackoverflow.com/a/10695714/489396 –

0

尝试定义/byASIN/LowPrice/:asin/:price的路由来处理,然后使用通配符处理其他所有内容。

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

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

对不起,我不明白这一点,就像'byASIN/:asin /:price'我有很多其他路线匹配。我认为它正在做的是,首先它检查顶部匹配是否匹配,即使'/ LowPrice /:asin'匹配但参数个数不匹配,所以它移动到'byASIN /:asin /:price',因为它需要'/ LowPrice'作为参数,因此总共有3个参数是错误的 – user3677331

0

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

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

如果这被定义为第一路径,则没有其他途径将被调用(如果没有调用next())。

如果你想要表达总是先使用严格的那个,那么你需要通过在松散的之前定义严格的那些来改变你的路由的顺序。

这会是很好,如果在路由表示支持优先级,这可能是你的问题很好的解决方案,但在那之前,不幸的是,这只能由订货:(