为什么res.redirect(' /')不起作用?

时间:2017-11-20 15:50:45

标签: node.js express redirect

我在Node.js上使用Express框架实现了一个简单的登录/注销方案。对于登录我没有问题:点击"登录",在提供正确的用户名和密码后,用户被正确地重定向到clientPage:

//POST route for logging in
router.post('/login', function (req, res, next) {
if (req.body.logusername && req.body.logpassword) {

    User.authenticate(req.body.logusername, req.body.logpassword, function (error, user) {
      if (error || !user) {
        var err = new Error('Wrong email or password.');
        err.status = 401;
        return next(err);
      } else {
        req.session.userId = user._id;
        return res.redirect('/clientPage');
      }
    });
  } else {
    var err = new Error('All fields required.');
    err.status = 400;
    return next(err);
  }
})

// GET route after registering
router.get('/clientPage', function (req, res, next) {
  User.findById(req.session.userId)
    .exec(function (error, user) {
      if (error) {
        return next(error);
      } else {
        if (user === null) {
          var err = new Error('Not authorized! Go back!');
          err.status = 400;
          return next(err);
        } else {
          return res.sendFile(path.join(__dirname + '/../views/clientPage.html'));
        }
      }
    });
});

注销时行为会发生变化,即使方案没有那么不同:点击"退出"客户端页面中的按钮," logout()"函数被调用,它向我的路由脚本处理一个AJAX GET请求" / logout":

function logout(){
    $.ajax({
        type: "GET",
        url: '/logout',
        async: true,
    })

}

// GET for logout
router.get('/logout', function (req, res, next) {
  if (req.session) {
    // delete session object
    req.session.destroy(function (err) {
      if (err) {
        return next(err);
      } else {
        return res.redirect('/');
      }
    });
  }
});

在我的浏览器的“网络”标签中,我看到第一个请求获得了" 200 OK"响应并成功将客户端重定向到给定页面,而注销请求导致" 304未修改"回答,在响应中包含我想要的页面(根,即我的主页),但不会将当前页面重定向到新页面。

1 个答案:

答案 0 :(得分:2)

问题出现是因为您要将注销作为ajax请求发送。这会导致您的ajax请求被重定向,但不会重定向您的页面。您要做的是通过在注销按钮上设置链接直接从页面发送请求。

<a href="/logout">log out<a/>

这样,您的整个页面都将被重定向。