Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Node.js api中提供JSON响应时防止缓存_Node.js_Express_Caching - Fatal编程技术网

在Node.js api中提供JSON响应时防止缓存

在Node.js api中提供JSON响应时防止缓存,node.js,express,caching,Node.js,Express,Caching,我有一个移动应用程序,它会定期从Node.js服务器中提取JSON文件 JSON响应是使用随机值动态生成的。它根本不应该被缓存 我试图阻止缓存: app.get('/important.json', function(req, res) { res.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); res.setHeader("Pragma", "no-cache");

我有一个移动应用程序,它会定期从Node.js服务器中提取JSON文件

JSON响应是使用随机值动态生成的。它根本不应该被缓存

我试图阻止缓存:

app.get('/important.json', function(req, res) {
        res.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
        res.setHeader("Pragma", "no-cache");
        res.setHeader("Expires", 0);
        res.json(...);
});
然而,当移动应用程序重新加载json时,它仍然从Fiddler观察到的服务器获得304 Not Modified响应


有人能告诉我反缓存是否正确吗?是因为etag吗?如果etag是问题所在,我可以专门为此api/端点禁用etag吗?

首先,尝试禁用etag:

app.set('etag', false);
第二,您可以截获对节点发出的所有请求,中间件位于所有其他处理程序的顶部

app.use(function(req, res, next) {
  //delete all headers related to cache
  req.headers['if-none-match'] = '';
  req.headers['if-modified-since'] = '';
  next();    
});

首先,尝试禁用etag:

app.set('etag', false);
第二,您可以截获对节点发出的所有请求,中间件位于所有其他处理程序的顶部

app.use(function(req, res, next) {
  //delete all headers related to cache
  req.headers['if-none-match'] = '';
  req.headers['if-modified-since'] = '';
  next();    
});

我在一个简单的express服务器上尝试了这一点,当我多次刷新页面时,我得到了200,所以它对我很有用。如果我注释掉res.setHeaderCache-Control,则无缓存、无存储,必须重新验证;res.setHeaderFragma,无缓存;res.setHeaderExpires,0;我得到304 not modified状态,因此您正确地使用了缓存控件,这可能与fiddler有关,在chromeetag上尝试一下也可以,即使您告诉客户端不要缓存etag,后续请求的etag也不会更改。etag仅在您发送的内容发生更改时才会更改,无论哪种方式,如果您正确设置了缓存控件都无关紧要。我在simple express服务器上尝试了这一点,当我多次刷新页面时,我得到了200,因此它对我有效。如果我注释掉res.setHeaderCache-Control,则无缓存、无存储,必须重新验证;res.setHeaderFragma,无缓存;res.setHeaderExpires,0;我得到304 not modified状态,因此您正确地使用了缓存控件,这可能与fiddler有关,在chromeetag上尝试一下也可以,即使您告诉客户端不要缓存etag,后续请求的etag也不会更改。etag仅在您发送的内容发生更改时才会更改,无论哪种方式,如果您在此处正确设置了缓存控件,则无关紧要