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

2024-01-28

我正在尝试在加载所有页面之前使用authenticateUser() 中间件。我没有将其包含在每次调用中(如 app.get('/',authenticateUser, function()...) 中所示),而是尝试在调用 app.use(app.router) 之前使用 app.use(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”被调用了很多次)

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


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

我举了一个简化的例子,这样你就可以理解我的观点:

登录路径

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 https://github.com/alexyoung/nodepad(该应用程序的教程在这里:http://dailyjs.com/tags.html#lmawa http://dailyjs.com/tags.html#lmawa )

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Node.js - 中间件中的 res.redirect 问题 的相关文章

随机推荐