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

cwe*_*105 3 etag caching node.js express

我正在使用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);
});
Run Code Online (Sandbox Code Playgroud)

Rod*_*goM 9

没有必要使用任何第三方模块etag.Express处理后面的逻辑etag,不需要编写代码.

  1. etag在Express中启用.在下面的示例中,我们使用强etags.

    // Use string ETag  
    app.set('etag', 'strong');  
    
    Run Code Online (Sandbox Code Playgroud)
  2. GET方法中构建您的响应:

    app.get('/my-data', (req, res) => {   
       ...
       res.append('Last-Modified', (new Date(lastModifiedStringDate)).toUTCString());
       return res.send(response);   
    }
    
    Run Code Online (Sandbox Code Playgroud)

Voilá,Express将发送您回复的内容200 OK或空洞的回复304 Not Modified.

如果未更改,则使用标头提交请求的客户端If-None-Match将接收HTTP .304 Not Modifiedetag

确保您的请求不发送Cache-Control: no-cache.Postman默认情况下的工具会发送标头Cache-Control: no-cache,这会使Express ETag无效(毕竟没有缓存没有缓存).您可以通过在Postman的设置中切换它来更改此行为.

我们Last-Modified在回复中添加了一个加号.你不需要像我们一样使用它.但Express也会If-Modified-Since:使用类似的逻辑(时间)而不是content(Etags)来尊重标题.

  • 我认为这部分是错误的“没有缓存毕竟没有缓存”,没有缓存意味着需要重新验证,这就是 etag 发挥作用的地方。 (2认同)