我正在使用node和express作为iOS应用程序的后端。数据存储在SQL Server数据库中,因此iOS应用程序查询服务器,服务器查询数据库,服务器接收数据库响应,然后将响应转发给iOS应用程序。我试图弄清楚缓存是如何工作的。我正在提供很多静态内容 - 例如博客文章。所以我计划使用etags,但我不确定它应该如何工作。我发出请求,获取内容,并在客户端缓存响应。好。然后,我稍后使用存储在“If-None-Match”标题中的先前响应的etag进行相同的请求。那又怎样?
Express.js会自动处理吗?它似乎没有 - 我无法得到它产生304响应。如果我在发送响应之前尝试检查响应头,我会得到null,所以在发送之前我无法获得响应的etag。那么我应该如何将请求etag与服务器发回的内容的etag进行比较?我是否应该使用自定义生成的etags并在服务器上缓存这些etags,然后将请求etags与此缓存进行比较?
以下是我设置的非常简单的测试方法,不涉及数据库。我只是向服务器发送一个号码,它返回正方形。如果我将带有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);
});
答案 0 :(得分:7)
无需使用etag
等任何第三方模块。 Express处理etag
背后的逻辑,无需编写代码。
在Express中启用// Use string ETag
app.set('etag', 'strong');
。在下面的示例中,我们使用强etags。
GET
使用app.get('/my-data', (req, res) => {
...
res.append('Last-Modified', (new Date(lastModifiedStringDate)).toUTCString());
return res.send(response);
}
方法构建您的回复:
200 OK
Voilá,Express会发送您回复的内容304 Not Modified
或回复If-None-Match
的空白身体。
如果304 Not Modified
未更改,则提交带标头etag
的请求的客户端将收到HTTP Cache-Control: no-cache
。
确保您的请求不会发送Cache-Control: no-cache
。默认情况下, Postman 等工具会发送标头Last-Modified
,这会使Express ETag无效(毕竟没有缓存没有缓存)。您可以通过在Postman的设置中切换它来更改此行为。
我们在回复中添加了If-Modified-Since:
作为加号。你不需要像我们一样使用它。但Express也会使用类似逻辑(时间)而不是内容(Etags
)来尊重-ne' rather than
标头。