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

我正在Node.js上使用Express框架实现一个简单的login/注销场景。 对于login我没有任何问题:点击“login”后,提供正确的用户名和密码,用户被正确redirect到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')); } } }); }); 

注销时行为会发生变化,即使情况没有那么不同:单击客户端页面中的“注销”button,会调用“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('/'); } }); } }); 

在我的浏览器的“networking”选项卡中,我看到第一个请求获得“200 OK”响应并成功将客户端redirect到给定页面,而注销请求导致“304未修改”应答,在响应中包含页面I想(根,即我的主页),但不会将当前页面redirect到新的。

问题出现是因为您发送注销作为ajax请求。 这会导致您的ajax请求被redirect,而不是您的页面。 你想要做的就是通过在你的注销button上设置一个链接直接从页面发送请求。

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

这样,您的整个页面将被redirect。