2014-01-05 22 views
0

假設我有一個網址,像快遞路線 - 做一個url params.id最好的方式服務於靜態和動態內容

www.foo.com/abc 
www.foo.com/huyr 
... etc 

其中「ABC」和「huyr」在這個例子中的ID和我」 d從數據庫中獲取關鍵是那個id的信息。

但是假設我也想靜態鏈接(即會提供靜態網頁),遵循相同的URL格式:

www.foo.com/about 
www.foo.com/contact 

什麼是做到這一點的最好方法是什麼?

現在我心裏有這樣的事情

exports.view = function(req, res) { 
    var id = req.params.id 
    switch (id) { 
     case 'about': 
      // load 'about' controller 
      break 
     case 'contact': 
      // load 'contact' controller 
      break 
     default: 
      // proceed with this function 
    } 

} 

這是最好的方法?有沒有更高效/有組織的方式來做到這一點?

回答

3

的最佳方式,在我看來,將服務於那些頁面,靜態與否,就像你使用任何其他頁面。用正確的頁面迴應GET請求。

// will respond to http://www.site.com/about 
app.get('/about', function(req, res, next) { 
    res.render('about.ejs' // etc 
}); 

// will respond to http://www.site.com/contact 
app.get('/contact', function (req, res, next) { 
    res.render('contact.ejs' // etc 
}); 

// will respond to any first subdir (iirc) http://www.site.com/(?) 
app.get('/:id', function (req, res, next) { 
    var id = req.param['id']; 

    // db query, etc 
}); 

當然,你的靜態頁面可以在一個路線,使它更清潔。只有你需要確保的是你在id路由之前對這些靜態路由作出響應,否則你將會響應你想要響應這個id的路由的about/contact url。訂單在這裏重要。

+0

導致去這種方式,但是,app.get(「/:身份證」,CB)似乎總是被調用(我把它作爲最後途徑)。我有它的控制檯日誌,也不管網址我去的,我看到的console.log輸出 – sqram

+0

app.get('/:ID,CB)應該總是讓呼籲除它以外以上這樣的目錄(約/聯繫)。除非你從about/contact路由中調用'next()',否則express將嘗試匹配下一個東西,這將是'/:id'。所以,如果你的話,不要從你的'靜態'頁面路由中調用next()。 – Chris

+0

我不知道。但這超出了這個問題的範圍。我會弄清楚。謝謝! – sqram