Node.js - 中间件中的res.redirect问题

时间:2012-01-04 11:55:39

标签: session node.js express middleware

我在加载所有页面之前尝试使用authenticateUser()中间件。而不是在每个调用中包含它(如在app.get('/',authenticateUser,function()...)),我尝试在调用app.use(app.router)之前使用app.use(authenticateUser)进行设置)。

但是,这没有用。 authenticateUser基本上是:

if (req.session.loginFailed) {
  next()
else {
    if (req.session.user_id) {
        ... 
        if (userAuthenticated) {
            next();
        } else {
            req.session.loginFailed = true;
            console.log('setting loginFailed to true');
            res.redirect('/login');
        }
     }
}

然后在app.get('/ login')中我将req.session.loginFailed设置为false;

这应该可行,但我只想在app.get()或app.post()等上为我的一个实际页面调用它。我认为很多时候它会被许多不同的请求调用(因为在加载一个页面时,'设置loginFailed为true'被多次调用)

有更好的方法吗?或者我应该在我网站上的每个页面之前调用它吗?

1 个答案:

答案 0 :(得分:9)

在我看来,你做的太多了。只有一条路由应该处理用户登录(检查用户和传递,如果成功则将用户名存储在会话中),并且只应在需要auth(不是全部)的路由上分配auth中间件。

我已经提出了一个简化的例子,以便您理解我的观点:

登录路线

app.post('/login', function (req, res) {
  var variables_set = (req.body.user && req.body.pass);
  if (variables_set && (req.body.user === 'username') && (req.body.pass === 'password')) {
    req.session.username = req.body.user;
  } else {
    res.redirect('/login?failed=true'); 
  }
});

身份验证中间件

if (!req.session.username) {
  res.redirect('/login');
} else {
  next();
}

您可以在Alex Young的Nodepad应用程序中看到更完整的示例:https://github.com/alexyoung/nodepad(此应用程序的教程:http://dailyjs.com/tags.html#lmawa