我使用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:报头。
发布于 2017-02-24 05:28:50
我是否应该使用自定义生成的etags并将其缓存到服务器上,然后将请求etags与此缓存进行比较?
是的,您可以使用类似etag npm模块的东西,它可以接受一个缓冲区或字符串,并为您提供一个强etag值:res.setHeader('ETag', etag(body))。如果您将修改日期存储在数据库中,那么您也可以简单地将这些日期以Last-Modified头的形式发送到客户端。在这种情况下,客户端将在后续请求中发送If-Modified-Since,然后您可以使用该use与所请求资源的modification列进行比较。
在任何一种情况下,您都将负责使用适当的状态代码、标头和正文进行响应。
如果您从实际的文件系统提供静态文件,那么您可以只使用serve-static express中间件,它将自动提供正确的缓存行为。
https://stackoverflow.com/questions/42418503
复制相似问题