2016-09-26 64 views
0

我想區分不同的網址。我有一個if/else的地方,但希望這可以做得更好在香草js。請不要表達js。區分不同的網址

/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 

} 

我覺得我的if/else沒有解決到的URI上述所有。請提出任何解決方案,以便我可以針對不同的網址以可重複使用的方式解決上述所有三種情況,並從那裏運行適當的查詢。

+0

爲什麼你不能使用快遞?它確實滿足你開箱即用的需求。 –

+0

,以更好地瞭解事情如何在引擎蓋下工作 – user2727195

+0

你有沒有看過快速js源代碼? –

回答

0

這是一個非常基本的例子,希望能讓你走上正軌。您首先需要存儲您想要的所有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數組的方法。

function resolveUrl(url){ 

    myUrls.forEach(function(item){ 
     var pieces = url.split('/'); 
     if(pieces.length === item.parts.length){ 
      for(var i=0; i<pieces.length; i++){ 
       // check if the piece is valid 
       if(item.parts[i] && pieces[i] !== item.parts[i]){ 
        break; 
       } 

       // if there is an exact match run the function and return 
       if(i === pieces.length - 1){ return item.func(pieces); } 
      } 
     } 
    }); 
} 

這將運行第一次遇到的匹配關聯函數,傳入包含給定url中所有值的數組。

注意:這是未經測試的代碼,寫在我頭上,旨在讓你開始,而不是一個完整的解決方案。

+0

謝謝,我打算在這裏工作,並會回答您的任何問題 – user2727195

+0

我還注意到,快遞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