【发布时间】:2021-10-27 09:12:17
【问题描述】:
在 Firebase 函数中,我试图接受一个大字符串并将其存储。
exports.store = functions.https.onRequest(async (req, res) => {
const body : string = req.body;
await store(body);
return req.send(...);
});
我发现使用 GZIP 可以提高性能并将文件大小减少大约 3-4 倍。
问题是,如果客户端发送一个 GZip 编码的字符串,内容编码如下:
header("Content-Encoding", "gzip")
然后对req.body 的调用将“自动”将字符串解码为UTF-8。这既大大降低了性能,又需要我再次压缩字符串以有效地将其存储在服务器中。
如果我没有指定内容编码,那么端点将按预期工作(即它不会解压缩字符串并将其按原样存储,因此运行速度更快)。问题是我无法验证用户是否发送了 gzip 压缩字符串而不是 UTF-8 字符串,除非我实施了一些技巧来检查字符串中的模式。
我相信有一些简单的解决方案,例如
functions.dontInflateTheRequestPleaseThanks();
exports.store = functions.https.onRequest(async (req, res) => {
if (req.headers["content-encoding"] !== "gzip") return res.status(415).send("gzip please");
const body : string = req.body;
await store(body);
return req.send(...);
});
【问题讨论】:
标签: node.js express http google-cloud-functions gzip