2014-01-05 21 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