【问题标题】:NodeJS making repeat redirectsNodeJS 进行重复重定向
【发布时间】:2016-08-24 18:00:22
【问题描述】:

我正在从 PHP 迁移到 NodeJS,我试图了解为什么中间件重定向会失控。

// Check to see if the request includes a session Username
app.use(function (req, res, next) {
  sessionmanager = req.session;
  if(sessionmanager.Username) {
    console.log('Session Details detected');
    next();
  } else {
    console.log('No session details detected, pushing user to login page');
    res.redirect('/login');
  }
});

// User Landing Page
app.get('/', function (req, res) {
  console.log('Request for landing page');
  res.send('Welcome Page!');
});


// User Login Page
app.get('/login', function (req, res) {
  console.log('Request for User login page');
  res.sendFile(path.join(__dirname, './public', 'login.html'));
});

当我访问 localhost:3000 时,它会将我重定向到 localhost:3000/login 但页面无法加载,因为它看起来被重定向了太多次。 当我查看控制台日志时,我可以数数; 20 多行消息“未检测到会话详细信息,将用户推送到登录页面”。

据我猜测,重定向循环回 app.use 函数,未能通过 session manager.Username 语句并陷入循环。 将流量重定向到 /login 页面的最佳方式是什么?我可以在 app.use 中加入 exclude 子句吗?

【问题讨论】:

    标签: node.js redirect


    【解决方案1】:

    通过阅读文档:https://expressjs.com/en/guide/using-middleware.html 您可以设置请求,以便 /login 在 app.use 之前出现,这样它就不是重定向循环的一部分。 示例:

    // User Login Page
    app.get('/login', function (req, res) {
      console.log('Request for User login page');
      res.sendFile(path.join(__dirname, './public', 'login.html'));
    });
    
    // Check to see if the request includes a session Username
    app.use(function (req, res, next) {
      sessionmanager = req.session;
      if(sessionmanager.Username) {
        console.log('Session Details detected');
        next();
      } else {
        console.log('No session details detected, pushing user to login page');
        res.redirect('/login');
        //res.sendFile(path.join(__dirname, './public', 'login.html'));
      }
    });
    
    // User Landing Page
    app.get('/', function (req, res) {
      console.log('Request for landing page');
      res.send('Welcome Page!');
    });
    

    现在您可以向 /login 网址发出请求,如果您没有登录会话,app.use 之后的任何页面都会将您推回到登录页面。

    【讨论】:

      【解决方案2】:

      您的登录路径位于中间件下方。它应该在您的路线列表的顶部,如下所示

      // User Login Page
      app.get('/login', function (req, res) {
        console.log('Request for User login page');
        res.sendFile(path.join(__dirname, './public', 'login.html'));
      });
      
      // Check to see if the request includes a session Username
      app.use(function (req, res, next) {
        sessionmanager = req.session;
        if(sessionmanager.Username) {
          console.log('Session Details detected');
          next();
        } else {
          console.log('No session details detected, pushing user to login page');
          res.redirect('/login');
        }
      });
      
      // User Landing Page
      app.get('/', function (req, res) {
        console.log('Request for landing page');
        res.send('Welcome Page!');
      });
      
      • 将为您提到的以下所有路由执行中间件。
      • 在您的代码中,如果未设置会话,您将重定向到 /login
      • 将在 /login 导致重定向循环之前再次检查中间件

      希望你理解

      【讨论】:

        猜你喜欢
        • 2012-08-09
        • 1970-01-01
        • 2012-11-11
        • 2015-06-26
        • 2011-05-03
        • 2011-09-08
        • 1970-01-01
        • 2023-03-09
        • 1970-01-01
        相关资源
        最近更新 更多