我正在使用node和express作为iOS应用程序的后端.数据存储在SQL Server数据库中,因此iOS应用程序查询服务器,服务器查询数据库,服务器接收数据库响应,然后将响应转发给iOS应用程序.我试图弄
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中间件,它将自动提供正确的缓存行为.