我使用node和express作为iOS应用程序的后端。数据存储在SQL server数据库中,因此iOS应用程序查询服务器,服务器查询数据库,服务器接收数据库响应,然后将响应转发给iOS应用程序。不过,我想弄清楚缓存是如何工作的。我提供了大量静态内容--例如博客文章。所以我计划使用etags,但我不确定它是如何工作的。我发出一个请求,获取内容,并在客户端缓存响应。好的。然后,我稍后使用存储在'If-None-Match‘头中的前一个响应的etag发出相同的请求。然后呢?
Express.js会自动处理这个问题吗?它似乎不是-我不能让它生成304响应。如果我试图在发送响应之前检查响应头,我会得到null,所以我不能在发送之前获得响应的etag。那么,我应该如何将请求etag与服务器将返回的内容的etag进行比较呢?我是否应该使用自定义生成的etags并将其缓存到服务器上,然后将请求etags与此缓存进行比较?
下面是我设置的一个非常简单的路径来测试它,不涉及数据库。我只需要向服务器发送一个数字,它就会返回平方。如果我向同一个url发送一个带有etag的请求,我将得到相同的响应。我可以检查请求的“if -None-Match”头,但是为了确定是否应该发送304而不是200状态,我应该将其与之进行比较吗?
router.use("/square/:testId", function(req, res) {
var obj = {};
obj["testId"] = req.params.testId;
obj["result"] = req.params.testId * req.params.testId;
res.setHeader('Cache-Control', 'public, max-age=5');
var h2 = JSON.stringify(res.headers,null,2);
console.log("The response headers: " + h2);
//Prints null
res.status(200).send(obj);
});发布于 2018-01-23 22:30:40
不需要使用任何第三方模块,如 etag.Express处理etag背后的逻辑,不需要编写代码。
etag。在下面的示例中,我们使用的是强etags。//使用string ETag app.set('etag','strong');
GET方法中构建您的响应:数据(‘/my-app.get’,(req,res) => { ...Res.append(‘上次修改’,(新日期(LastModifiedStringDate)).toUTCString());返回响应(res.send);}
瞧,Express将发送响应200 OK的内容或带有响应304 Not Modified的空正文。
如果304 Not Modified未更改,则提交带有头etag的请求的客户端将收到HTTP etag。
确保您的请求不会发送 Cache-Control: no-cache.默认情况下,像Postman这样的工具会发送报头Cache-Control: no-cache,这会使ETag无效(无缓存毕竟不是缓存)。您可以通过在Postman的设置中对其进行切换来更改此行为。
我们在响应中添加了Last-Modified作为一个加号。您不需要像我们一样使用它。但是Express也将使用类似的逻辑(时间)而不是内容(Etags)来尊重If-Modified-Since:报头。
https://stackoverflow.com/questions/42418503
复制相似问题