2016-04-26 6 views
3

Я прочитал другие вопросы о расхождении маршрутов людей, а затем заказал маршруты, разрешающие проблему. У меня есть эта проблема, когда мой 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, ответьте некоторым предупреждением, например. вы звоните с меньшим аргументом. Что мне здесь не хватает?

ответ

3

По умолчанию экспресс-параметры URL являются не 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 /', и я хотел бы, чтобы совпадение было строгим, и если есть недостающая проблема предупреждение о том, что пара отсутствует, а не переместить его на следующий совершенно другой маршрут. – 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

Экспресс соответствует маршруту по заказу, который вы вставляете. Если у вас есть определенные маршруты, определенные первым, тогда экспресс будет использовать этот в качестве первого. Крайним примером может быть

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

Если это было определено в качестве первого маршрута, то никакой другой маршрут не будет называться (если без вызова следующего()).

Если вы хотите, чтобы выражение всегда использовало строгий первый, то вам нужно будет изменить порядок ваших маршрутов, указав строгие, определенные перед свободными.

Было бы хорошо, если выразить приоритет поддержки в маршруте, который может быть хорошим решением для вашей проблемы, но до тех пор, к сожалению, это не может быть исправлено только приказывать :(

Смежные вопросы