NodeJS重复重定向

时间:2016-08-24 18:00:23

标签: node.js redirect

我正在从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函数,无法传递会话manager.Username语句并陷入循环。 什么是将流量重定向到/登录页面的最佳方法?我可以在app.use中添加一个exclude子句吗?

2 个答案:

答案 0 :(得分:1)

阅读文档:https://expressjs.com/en/guide/using-middleware.html 您可以设置请求,以便/ app在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的任何网页都会将您推回到登录页面。

答案 1 :(得分:0)

您的登录路由位于中间件下方。它应该是你的路线列表顶部像这样

// 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结果之前再次检查中间件

希望你理解