基于数组中的字符串路由

时间:2014-02-05 07:57:23

标签: node.js express

如果我有一个类似的数组:

var users = [
    { name: 'joe', info : 'this man's name is joe'},
    { name : 'betty', info : 'this woman's name is betty'}
];

和路线如:

app.get('/test/:person', loadUser, function(req, res) {
   if (!err) {
      res.send(req.user.info);
   }
   else {
      res.redirect('/');
   }
})

如何设置loadUser中间件,以便如果:person参数等于数组中的某个名称,则页面将加载其各自的信息。但是,如果输入的:person不在数组中,则只会重定向到另一个页面。

到目前为止我所拥有的是:

function loadUser(req, res, next){
    for(var i= 0; i < users.length; i++) {
    if ( req.params.gg == users[i].id ) {
    req.user = users[i];    
    }
}       
    next();
}

但我不知道如何添加错误部分和next()部分。

1 个答案:

答案 0 :(得分:1)

如果在Error数组中找不到路由参数next,则创建一个新的:person对象并将其传递给users回调

function loadUser(req, res, next) {
    var person = req.params.person;
    for(var i= 0, len = users.length; i < len; i++) {
      if ( person === users[i].name ) {
        req.user = users[i];
      }
    }
    if(!req.user) next(new Error('No such user ' + person));
    else next();
}

Connect中使用的错误处理程序中间件必须使用4个参数,也就是说,它必须具有4个arity。实际上,使用if(err)显式检查错误不是必需的。错误处理程序中间件,因为Express仅在发生错误时才调用它。

var sendInfo = function (req, res, next) {
  res.send(req.user.info);
}

app.get('/test/:person', loadUser, sendInfo, function(err, req, res, next) {
   if (err) {
      res.redirect('/');
   }
});