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

Var*_*ngh 8 session middleware node.js express

我在加载所有页面之前尝试使用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');
        }
     }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

ale*_*lex 10

在我看来,你做的太多了.只有一条路由应该处理用户登录(检查用户和传递,并在会话中存储用户名,如果成功),您应该仅在需要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'); 
  }
});
Run Code Online (Sandbox Code Playgroud)

身份验证中间件

if (!req.session.username) {
  res.redirect('/login');
} else {
  next();
}
Run Code Online (Sandbox Code Playgroud)

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