2016-09-26 2 views
0

Я пытаюсь различать разные URL-адреса. У меня есть if/else, но, надеюсь, это может быть сделано лучше в vanilla js. Никаких выражений.различаются между разными URL-адресами

/product 
/product/1 
/product/1/customer 

/product 
/product/2 
/product/2/customer 


/customer 
/customer/1 
/customer/1/product 

/customer 
/customer/2 
/customer/2/product 

Текущая стратегия:

if(request.url.indexOf('/product') != -1 && request.url.length == '/product'.length) { 

} else if { // /product/:id 
    if(!request.params) request.params = {}; 
    request.params.id = request.url.match(/^\/product\/([^\\/]+?)(?:\/(?=$))?$/i)[1]; 
} else { // 3rd case /product/1/customer 

} 

Я думаю, что я, если/еще не решив все Ури упоминалось выше. Пожалуйста, предложите любое решение, чтобы я мог разрешить все 3 случая из вышеперечисленного многоразовым способом для разных URL-адресов и запускать соответствующие запросы оттуда.

+0

Почему вы не можете использовать экспресс? Он делает именно то, что вам нужно из коробки. –

+0

, чтобы лучше понять, как все работает под капотом – user2727195

+0

У вас есть взгляд на экспресс-код js? –

ответ

0

Вот очень простой пример, который, надеюсь, поставит вас на правильный путь. Сначала вам нужно сохранить все нужные вам URL и связанные с ними функции, которые вы хотите запустить. Затем, когда появляется новый URL-адрес, вам нужно сравнить его с вашими сохраненными URL-адресами, чтобы узнать, есть ли совпадение. Поскольку URL-адреса могут иметь определенные переменные значения, вам нужен способ борьбы с подстановочными знаками.

Итак, сначала создайте функцию, которая добавляет конкретную схему URL и связанную с ней функцию запуска в массив.

var myUrls = []; 
function addUrl(url, associatedFunc){ 

    mrUrls.push({ 
     func: associatedFunc, 
     parts: url.split('/').map(function(item){ 
      return item.startsWith(':') ? null : item; 
     }); 
    }); 
} 

Чтобы добавить новый URL-адрес вы бы поставить : перед любой части URL, который может быть диким.

addUlr('/product/:value/customer', doCustomerStuffFunc); 

Далее вам нужен способ сравнения входящих запросов URL-адресов с вашим массивом url.

Это будет работать с первой встреченной совпадающей функцией, передаваемой в массив, содержащий все значения в заданном URL-адресе.

Примечание. Это непроверенный код, написанный на моей голове, предназначен для начала работы, а не для полного решения.

+0

спасибо, я собираюсь поработать над этим, и вернусь к вам с любыми вопросами – user2727195

+0

Я также заметил, что express js использует https://github.com/pillarjs/path-to-regexp – user2727195

+0

Я принял ответ, и я узнал от него, но вот интересная идея, я использовал дикую карточную технику с этой страницы и в основном разрабатывал оператор switch для каждого запроса http://stackoverflow.com/questions/21017472/add-a-wildcard-to- a-javascript-switch-statement – user2727195

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