【问题标题】:Node.js - Issue with res.redirect in middlewareNode.js - 中间件中的 res.redirect 问题
【发布时间】:2012-02-02 07:57:00
【问题描述】:

我正在尝试在加载我的所有页面之前使用 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() 等上为我的一个实际页面调用它。我认为它被许多不同的请求调用了很多次(因为在加载一个页面时,'setting loginFailed to true' 被调用了很多次)

有没有更好的方法来做到这一点?还是我应该在我网站上的每个页面之前调用它?

【问题讨论】:

    标签: session node.js express middleware


    【解决方案1】:

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

    我举了一个简化的例子,以便你理解我的观点:

    登录路径

    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

    【讨论】:

    • 我同意@alessioalex。但是,如果您坚持所制定的方法,请确保您的 app.use(authenticateUser) 在会话中间件之后。
    • 很公平,这很有趣,因为我实际上是在学习 nodepad 教程。问题是我的整个网站都要求您登录,所以我拼凑了一种方法,不必在所有路线上手动包含它,但如果那是正确的方法,我只会包含它。
    猜你喜欢
    • 2016-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    相关资源
    最近更新 更多