当前位置 : 主页 > 网页制作 > Nodejs >

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

来源:互联网 收集:自由互联 发布时间:2021-06-16
我正在使用node和express作为iOS应用程序的后端.数据存储在SQL Server数据库中,因此iOS应用程序查询服务器,服务器查询数据库,服务器接收数据库响应,然后将响应转发给iOS应用程序.我试图弄
我正在使用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);
});

Am I supposed to use custom generated etags and cache these on the server, then compare request etags with this cache?

是的,您可以使用类似于etag npm模块的东西,它可以使用缓冲区或字符串并为您提供强大的etag值:res.setHeader(‘ETag’,etag(body)).如果要在数据库中存储修改日期,那么您也可以简单地以Last-Modified标头的形式将它们发送到客户端.在这种情况下,客户端最终会在后续请求中发送If-Modified-Since,然后您可以使用它来与所请求资源的修改列进行比较.

在任何一种情况下,您都将负责使用适当的状态代码,标题和正文进行响应.

如果您从实际文件系统提供静态文件,那么您可以使用serve-static express中间件,它将自动提供正确的缓存行为.

网友评论