2017-02-23 170 views
1

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

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

下面是我设置的一个非常简单的路线来测试这个,没有涉及数据库。我只是向服务器发送一个数字,然后它返回正方形。如果我发送带有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); 
}); 

回答

1

我应该使用自定义生成的ETag和缓存这些服务器上,然后比较请求随着该高速缓存的ETag?

是的,你可以使用类似etag NPM模块,可以采取缓冲或字符串,并为您提供强大的ETag值:res.setHeader('ETag', etag(body))。如果您要在数据库中存储修改日期,那么您还可以简单地以Last-Modified标题的形式将这些修改日期发送给客户端。在这种情况下,客户端最终会在随后的请求中发送If-Modified-Since,然后您可以使用该请求与请求的资源的修改列进行比较。

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

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

0

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

  1. 启用快速etag。在下面的例子中,我们使用强大的etags。

    // Use string ETag 
    app.set('etag', 'strong'); 
    
  2. 建立在GET方法你的回应:

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

瞧,Express将发送您的响应200 OK的任何内容或空体反应304 Not Modified

如果etag未更改,那么提交标头为If-None-Match的客户端将收到HTTP 304 Not Modified

确保您的请求不发送Cache-Control: no-cache。诸如Postman之类的工具默认发送报头Cache-Control: no-cache,这会使Express ETag无效(毕竟没有缓存是没有缓存的)。您可以通过在邮差的设置中切换它来改变这种行为。

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

相关问题