如何从节点js上的http get reqest中删除缓存

时间:2016-08-12 14:31:39

标签: javascript node.js caching

我正在研究节点js web应用程序,我正在做一个http get请求,该请求解决了数据库并通过查询获取数据。

http get请求在chrome上工作正常但在IE上每个get都没有更新但是从某种缓存返回。这使得db查询的结果不会更新(因为它来自chache)。

我可以看到它是从IE中的chache表格F12开发者工具中获取的:

enter image description here

我的代码如下。我知道我应该添加类似的内容:

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();

    });  

}

1 个答案:

答案 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时间,以便时间戳始终是唯一的。