在浏览器中使用后退键,没有触发Nodejs路由,求解
在浏览器中使用后退键,没有触发Nodejs路由,求解
exports.gets = function(req, res){
if (req.session.name && req.session.name !== '') {
res.render('chat');
}else{
res.redirect('/login');
}
};
exports.kill = function(req,res){ if(req.session.name && req.session.name !==’’) { req.session = null; res.clearCookie(‘chating’); res.redirect(’/login’); }else{ res.redirect(’/chats’,res.flash(‘error’,‘cannot kill’)); } }
代码如上,我希望在访问gets页面时,判断name是否存在,若存在则显示chat页面,否则跳转到login页面。 但是,当我执行了kill操作后,按下浏览器的后退按钮,仍然能访问chat页面,而debug中并没有触发gets函数~求大神帮忙。我是希望按下后退按钮后仍然能根据是否存在name而跳转。
后退不是浏览器缓存了你的页面么,不是你去请求的吧。
你遇到的问题是因为浏览器缓存导致的。当你点击后退按钮时,浏览器通常会从缓存中加载页面,而不是重新向服务器发起请求。因此,gets
路由并不会被触发,页面也没有重新渲染。
为了确保每次点击后退按钮时都能正确地触发 gets
路由并进行相应的逻辑判断,你可以采取以下几种方法:
方法一:禁用浏览器缓存
在开发环境中,可以禁用浏览器缓存来强制每次请求都从服务器获取最新的数据。你可以在 Express 中设置响应头,这样浏览器将不会缓存页面:
app.use((req, res, next) => {
res.set({
'Cache-Control': 'no-cache, no-store, must-revalidate',
'Pragma': 'no-cache',
'Expires': 0,
});
next();
});
方法二:使用前端重定向
另一种方法是在前端使用 JavaScript 检测用户是否按下了后退按钮,并根据需要重定向到不同的页面。
例如,在客户端 JavaScript 代码中添加如下逻辑:
<script>
window.addEventListener('popstate', function(event) {
// 检查 session name 是否存在
fetch('/check-session')
.then(response => response.json())
.then(data => {
if (!data.name) {
window.location.href = '/login';
}
});
});
</script>
然后在 Node.js 中创建一个检查会话状态的路由:
app.get('/check-session', (req, res) => {
res.json({ name: req.session.name || '' });
});
总结
以上两种方法都可以解决你的问题。第一种方法简单且适用于开发环境,第二种方法则更加灵活,可以更好地处理复杂的业务逻辑。选择哪种方法取决于你的具体需求和应用场景。