我在Firebase之上构建了一个GraphQL API。 API使用连接到Firebase Hosting的云功能来处理请求。
我的目的是缓存发送到GraphQL API的请求的响应。
ExpressJS中间件配置如下:
function setCacheHeaders(req, res, next) {
res.set('Cache-Control', 'public, max-age=300, s-maxage=600');
return next();
}
如果我向API发送GET请求,我会看到它到达CDN:
X-Cache: HIT
X-Cache-Hits: 1
X-Served-By: cache-lhr6343-LHR
但是,当我发送POST请求(这是与GraphQL端点交互的常用方式,即使它是只读操作)时,我注意到没有请求到达缓存。但是,响应包括以下标题:
HTTP/1.1 200 OK
Accept-Ranges: bytes
Connection: keep-alive
Content-Length: 311
Content-Type: application/json
Date: Thu, 27 Jul 2017 05:41:02 GMT
Server: nginx
Strict-Transport-Security: max-age=31556926
Vary: Accept-Encoding, Authorization, Cookie
Via: 1.1 varnish
X-Cache: MISS
X-Cache-Hits: 0
X-Served-By: cache-lcy1133-LCY
X-Timer: S1501134062.745716,VS0,VE640
cache-control: public, max-age=300, s-maxage=600
function-execution-id: xg0qjlghrtrv
x-cloud-trace-context: 02434a5f73159e24d949e74026bb8843, 02434a5f73159e24d949e74026bb8843
x-powered-by: Express
是否无法使用Firebase Hosting将响应缓存到POST请求?
答案 0 :(得分:2)
没有。 POST不是幂等的,因为您无法访问Fastly(Firebase托管CDN提供商)清漆规则,所以您甚至无法“破解”实现它。
答案 1 :(得分:1)
Firebase托管不会缓存POST响应。
我不是GraphQL专家,但据我所知,他们允许使用GET verb for non-mutating requests。虽然它需要您更改代码,但它允许您缓存响应。