如何使用Express.js返回304未修改状态?

时间:2017-02-23 14:27:18

标签: node.js express caching etag

我正在使用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);
});

1 个答案:

答案 0 :(得分:7)

无需使用etag 等任何第三方模块。 Express处理etag背后的逻辑,无需编写代码。

  1. 在Express中启用// Use string ETag app.set('etag', 'strong'); 。在下面的示例中,我们使用强etags。

    GET
  2. 使用app.get('/my-data', (req, res) => { ... res.append('Last-Modified', (new Date(lastModifiedStringDate)).toUTCString()); return res.send(response); } 方法构建您的回复:

    200 OK
  3. 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标头。