我在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未修改"回答,在响应中包含我想要的页面(根,即我的主页),但不会将当前页面重定向到新页面。
答案 0 :(得分:2)
问题出现是因为您要将注销作为ajax请求发送。这会导致您的ajax请求被重定向,但不会重定向您的页面。您要做的是通过在注销按钮上设置链接直接从页面发送请求。
<a href="/logout">log out<a/>
这样,您的整个页面都将被重定向。