Express js 缓存首页页面

3
我使用express.js在node中创建了一个身份验证系统。它运行良好,但是当我尝试注销时,我会重定向到主页“localhost:3100/”。当我去那里时,有时它显示已登录的缓存状态,有时是新刷新的页面。如果我刷新页面,一切都会恢复正常。如果我重定向到另一页,则一切正常。
这主要发生在我基于res.locals.currentUser更改内容时。currentUser在中间件中设置。在Navbar中,我使用这个<% if(currentUser)% > <%}else{%> <%}%>。因此,在重定向时,有时会刷新,有时会使用缓存视图。
此外,我正在使用express.js 3。

你是如何进行重定向的?你使用的是 res.redirect('/') 吗? - Thalis K.
是的,我正在使用 res.redirect('/') 进行重定向。 - sanjeev
1个回答

4

对于您的/路由,您想添加一个中间件,以便始终在无缓存情况下加载。请添加以下内容:

app.use(function noCacheForRoot(req, res, next) {
    if (req.url === '/') {
      res.header("Cache-Control", "no-cache, no-store, must-revalidate");
      res.header("Pragma", "no-cache");
      res.header("Expires", 0);
    }
    next();
});

将此中间件放在列表的较高位置,即在app.use(app.router)app.user(express.static(...))语句之前。


谢谢你的回答。但是这主要发生在我基于 res.locals.currentUser 更改内容时。currentUser 是在中间件中设置的。在 Navbar 中,我使用 <% if(currentUser)% > <content> <%}else{%> <content><%}%>。因此,在重定向时,有时会刷新,有时会使用缓存视图。 - sanjeev
如果我理解正确的话,您正在设置 res.locals.currentUser 然后执行 res.redirect('/')res.locals 的作用域限定在请求范围内,因此仅在该请求/响应周期中呈现的视图中可用。如果您执行重定向,则这是一个新的请求/响应周期,并且您不应该有来自上一个周期的任何 res.locals。在我上面编写的中间件中,添加 console.log("res.locals : ", res.locals) 并查看打印出来的内容。 - Thalis K.
上面的中间件对我不起作用。我通过创建两个页面,每个页面有两个链接来复制问题。 点击第一个链接将创建会话变量,点击第二个链接将带您进入下一页。在第二页上,第一个链接将销毁会话变量,第二个链接将带您回到第一页。 一旦您在第一页上创建了会话,请转到第二页,返回第一页并根据会话显示一些数据。再次转到第二页,销毁会话变量,重定向到第一页。您将看到陈旧的数据。 - sanjeev
如果您使用单页应用程序并重新加载页面而不是重定向,则此方法可以正常工作。重新加载将从服务器获取新鲜数据。我是Node.js的新手,所以不确定这是否是有效行为。 - sanjeev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接