使用 Express js 作为服务器的客户端(请求标头)如何处理 max-age、min-fresh 和 max-stale HTTP 标头?

Posted

技术标签:

【中文标题】使用 Express js 作为服务器的客户端(请求标头)如何处理 max-age、min-fresh 和 max-stale HTTP 标头?【英文标题】:How do max-age, min-fresh and max-stale HTTP headers work from client (request headers) using Express js as server? 【发布时间】:2021-06-10 14:39:55 【问题描述】:

我在 Node js 中有一个带有 Express js 的服务器,我从服务器发送以下 Cache-Controlmax-age=50,(我希望它有 50 秒的新鲜度,这个值仅用于测试) :

server.get('/data', (_, res) => 
    res.set('Cache-Control', 'max-age=50');
    res.json(
        msg: 'Hola',
    );
);

我从客户端分配了 max-stale 或 min-fresh 或 max-age,但它似乎对缓存行为没有影响:

document.getElementById('btn-get-data').addEventListener('click', () => 
    fetch('http://localhost:4000/data', 
        headers: 
            'Cache-Control': 'max-stale=50',// <-- I also tried max-age and min-fresh
        ,
    )
        .then((res) => res.json())
        .then((json) => 
            console.log(json);
        )
        .catch((error) => console.log(error));
);

例如,我模拟客户端失去互联网连接(离线),缓存仍然是新鲜的,因为我分配了 50 秒,但是当缓存到期时,它不会继续使用或服务过时的缓存,即使我指定它将使用来自客户端的max-stale=50

我尝试了 max-age 和 min-fresh 但我没有看到任何缓存行为。文档说:

最大年龄 表示客户端愿意接受年龄不大于指定时间(以秒为单位)的响应。除非 maxstale 指令也包括在内,否则客户端不愿意接受过时的响应。 最新鲜 表示客户端愿意接受其新鲜度不小于其当前年龄加上指定时间(以秒为单位)的响应。也就是说,客户端希望响应至少在指定的秒数内仍然是新鲜的。 最大陈旧 表示客户端愿意接受已超过其过期时间的响应。如果为 max-stale 分配了一个值,则客户端愿意接受已超过其过期时间不超过指定秒数的响应。如果没有为 max-stale 分配值,则客户端愿意接受任何年龄的陈旧响应。

但它不起作用。这三个标头如何从客户端工作?我是不是误会了?有人可以用简单或冗长的词来解释这个标题以及如何从客户那里分配它们吗?

【问题讨论】:

【参考方案1】:

您在这里正确使用了max-stale

如果给 max-stale 赋值,那么客户端是 愿意接受已超过其新鲜度的响应 不超过指定的秒数。

您的浏览器缓存是私有的,因此您不需要放置public 指令即可使用它。

但是,您应该确认您使用的浏览器支持这些标头。例如back in 2017:

Chrome 在请求中只支持max-age=0,并且只支持值为0。它不支持min-freshmax-stale

比较:

在经过测试的浏览器中,Firefox 在请求中支持 max-agemax-stalemin-fresh,两者都具有简单的新鲜生命周期,并且当存在 Age 标头时。

【讨论】:

【参考方案2】:

尝试使用“res.setHeader”并确保包含“public”指令。

res.setHeader("Cache-Control", "public, max-age=50");

https://www.geeksforgeeks.org/node-js-response-setheader-method/

Parameters:此属性接受提到的单个参数 上面和下面描述:

name : 接受头部的名字,不区分大小写。 value : 它可以接受任何值,如对象、字符串、整数、数组等。

返回值:不返回任何值,而是设置一个标头

【讨论】:

我这周没有电脑,我几乎不能,我会做测试告诉你,谢谢你:)

以上是关于使用 Express js 作为服务器的客户端(请求标头)如何处理 max-age、min-fresh 和 max-stale HTTP 标头?的主要内容,如果未能解决你的问题,请参考以下文章

在 express.js 中,req.files 未定义

Elastic beanstalk 请求上的 Node.js 是 HTTPS,但 express 是作为 HTTP 服务的。这安全吗?

如何在 Cappuccino 中使用 Node.js?

使用 Express Handlebars 和 Angular JS

express.js 4 JSON 解析来自 GET 请求的问题(从数据表请求数据)

React-Facebook-Login 和 Node.js Express