2013-09-30 65 views
1

我有這條線路的麻煩:的NodeJS +快遞3 - 在路線斜線,然後固定操作

app.get('/project/:handle/browse/:filepath(.*)/children', files.children);       //getting contents of any node in the directory structure 

我希望路由解析,其中包括一個:filepath參數,其中可以包括斜槓的URL,然後運行一個/children操作。 (.*)是我對:filepath參數設置正則表達式限制的失敗嘗試。

我想使用這樣的方案permalinking的目的,所以移動一些路由參數參數不是一個選項,和URI編碼會讓他們醜陋...我環顧四周,但它似乎像所有的答案在stackoverflow是針對在網址末尾的斜槓參數,如:

app.get('/project/:path', files.children); 

任何想法?

謝謝!

+1

我afrai d你將不得不使用正則表達式路由。 http://expressjs.com/api.html#app.VERB – gustavohenke

+0

你可以用正則表達式來做到這一點,但如果文件路徑以'/ children'結尾會發生什麼? –

+1

Laurent,我認爲不會有任何問題,因爲無論如何你需要有一個尾隨/孩子。該文件路徑將解析爲「某些東西/孩子」,像一些URL /兒童/兒童的網址。 –

回答

2

我決定使用正則表達式路由,按照gustavohenke的評論。這是工作代碼!

app.get(/project\/(([a-z]|[A-Z]|[0-9])+)\/browse\/(.+)\/children/, 
     function(req,res) 
     { 
      req.params.handle = req.params[0];  //project handle 
      req.params.filepath = req.params[2]; //relative path 
      files.children(req, res); 
     } 
    );       //getting contents of any node in the directory structure 

關鍵是要知道,每一個URL的「切片」將可在req.params []數組中,只要你在路由使用(something)部分。使用內聯回調函數並使用它將數組中的每個元素複製到控制器操作中的可讀參數中...然後像平常一樣調用控制器方法。

至於正則表達式本身,我寫\/逃脫正則表達式的/(斜槓)和使用的(.+)聲明它,這意味着「任何字符(.)至少一次(+)。如果你想要的任何字符零次或多次,你會使用(.*)

感謝您指出我的正確途徑。

2

這個怎麼樣?

app.get('/project/:handle/browse/:filepath*/children', function(req, res) { 
    var filepath = req.params.filepath + (req.params[0] || ''); 
    ... 
}); 
+0

一個很好的建議,我試了一下,它的工作原理!不過,我相信我的答案可能會幫助有不同問題的人解釋更完整。我會喜歡,但會接受我的答案,除非出現更有趣的答案。因爲接受我的得分與接受你的得分相同,所以我很客觀......和平! –