2016-04-26 88 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())。

如果你想要表達總是先使用嚴格的那個,那麼你需要通過在鬆散的之前定義嚴格的那些來改變你的路由的順序。

這會是很好,如果在路由表示支持優先級,這可能是你的問題很好的解決方案,但在那之前,不幸的是,這隻能由訂貨:(