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

我正在使用节点,并表示iOS应用程序的后端。 数据存储在SQL Server数据库中,所以iOS应用程序查询服务器,服务器查询数据库,服务器接收数据库响应,然后将响应转发给iOS应用程序。 我试图找出caching如何工作。 我提供了大量的静态内容 – 例如博客文章。 所以我打算使用etags,但我不确定它应该如何工作。 我提出请求,获取内容,并在客户端caching响应。 好。 然后,我在之后的“If-None-Match”标题中存储上一个响应的etag。 那又怎样?

Express.js是否自动处理? 它似乎并没有 – 我不能得到它产生一个304响应。 如果我在发送响应之前尝试检查响应头,则会得到空值,所以在发送响应之前我无法获取响应的etag。 那么,我该如何将请求etag与服务器发送的内容的etag进行比较呢? 我应该使用自定义生成的etags并将其caching在服务器上,然后将请求etags与此caching进行比较?

下面是我设置的一个非常简单的路线来testing这个,没有涉及到数据库。 我只是发送一个号码到服务器,并返回广场。 如果我发送一个etag请求到相同的url,我会得到相同的回应。 我可以检查请求的“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); }); 

我应该使用自定义生成的etags并将其caching在服务器上,然后将请求etags与此caching进行比较?

是的,你可以使用类似etag npm模块的东西,它可以使用缓冲区或string,并为您提供强大的etag值: res.setHeader('ETag', etag(body)) 。 如果您要在数据库中存储修改date,那么您也可以简单地将这些修改date以Last-Modified标头的forms发送给客户端。 在这种情况下,客户端最终会在随后的请求中发送一个If-Modified-Since ,然后您可以使用它来与所请求资源的修改列进行比较。

在任何情况下,您都将负责使用相应的状态代码,标题和正文进行回复。

如果你正在从实际的文件系统提供静态文件,那么你可以使用服务静态expression中间件,它会自动提供正确的caching行为。