具有不同参数的多个路由,调用相同的资源

时间:2014-03-05 21:40:31

标签: node.js rest express mongoose

expressjs是否可以让多条路由调用相同的资源,如下所示:

app.get('/users/:user_id', users.getOne)
app.get('/users/:username', users.getOne)

我希望能够在get请求中使用params(:user_id或:username)来调用users.getOne。

在users.getOne函数中,如何确定使用了哪一个并根据它构建我的查询?

exports.getOne = function(req, res){

  var queryParams = ? // I need help here

  Users
    .find(queryParams)
    ...

谢谢!

可能相关:express.js - single routing handler for multiple routes in a single line

2 个答案:

答案 0 :(得分:4)

从express的角度来看,这两条路线都会匹配同一组请求网址。你只需要其中一个,你可以将它命名为更有意义:

app.get('/users/:key', users.getOne);

//...
// http://stackoverflow.com/a/20988824/266795
var OBJECT_ID_RE = /^[a-f\d]{24}$/i;
exports.getOne = function(req, res) {
  var conditions = {_id: req.params.key};
  if (!OBJECT_ID_RE.test(req.params.key)) {
    conditions = {username: req.params.key};
  }
  Users.find(conditions)...

如果您最终希望在整个代码库中的许多路径中使用此模式,则可以将其提取到/users/:user参数并根据@ alex的答案使用app.param,但封装代码以找到用户并将其粘贴到req.user上,这样实际的路由处理程序就可以假设用户在执行时已经正确找到并加载,404处理也可以集中处理。

答案 1 :(得分:1)

  

事实上,从快递的角度来看,这是相同的路线。

不,他们不是。一条路线有:user_id参数,另一条路线有:username

这是一个合适的解决方案:

var OBJECT_ID_RE = /^[a-f\d]{24}$/i;

app.param('user_id', function(req, res, next, value, name) {
  if (OBJECT_ID_RE.test(value)) {
    next()
  } else {
    next('route')
  }
})

app.get('/users/:user_id', users.getOne)
app.get('/users/:username', users.getOne)

app.param设置要调用路由的先决条件。这样,当user_id匹配模式时,第一个路由被调用,否则被调用。