首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何通过Express.js返回304未修改状态?

如何通过Express.js返回304未修改状态?
EN

Stack Overflow用户
提问于 2017-02-23 22:27:18
回答 2查看 11.9K关注 0票数 6

我使用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状态,我应该将其与之进行比较吗?

代码语言:javascript
运行
复制
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);
});
EN

Stack Overflow用户

回答已采纳

发布于 2018-01-23 22:30:40

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

  1. 在Express中启用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:报头。

票数 22
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42418503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档