我正在研究节点js web应用程序,我正在做一个http get请求,该请求解决了数据库并通过查询获取数据。
http get请求在chrome上工作正常但在IE上每个get都没有更新但是从某种缓存返回。这使得db查询的结果不会更新(因为它来自chache)。
我可以看到它是从IE中的chache表格F12开发者工具中获取的:
我的代码如下。我知道我应该添加类似的内容:
res.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
根据我的要求,但我认为我可能会把这条线放在错误的位置,因为仍然从chache取得了reuqest,并给了我糟糕的结果......
客户端
$http.get('/users')
.success(function(data) {
$scope.usersNumber = data.length;
})
.error(function(data) {
console.log('Error: ' + data);
});
服务器
app.get('/users', function(req, res){
get_user(req, res);
});
var get_user= function(req, res){
var query= User_session.find();
query.exec( function(err, docs){
res.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
res.json(docs);
//mongoose.connection.close();
});
}
答案 0 :(得分:1)
尝试在标题中添加max-age:
Cache-Control:private, no-cache, no-store, must-revalidate, max-age=0
Pragma:no-cache
您从开发人员工具中捕获的响应显示响应是从缓存中选取的。缓存的响应有一个expires标头,它指定了可以从缓存中选择响应的持续时间,并且不会被视为过时。
您可能希望为端到端重新加载包含no-cache指令
请求包含“no-cache”缓存控制指令或for 与HTTP / 1.0客户端兼容,“Pragma:no-cache”。字段名称 不得在请求中包含no-cache指令。该 服务器在响应此类请求时不得使用缓存副本。
参考:https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
您还可以尝试使用另一种解决方案来强制客户端重新加载。将查询字符串参数添加到您的网址。 例如:如果您有/ users,请将网址设为/ users?uniqstamp =< timestamp>
您的浏览器始终认为包含查询字符串的整个路径都会生成一个URL。所以你总会得到一个新鲜的200 ok。确保您使用的时间戳是以毫秒为单位的javascript时间,以便时间戳始终是唯一的。