我想将压缩数据 (gzip) 发送到某个 URL,该 URL 将触发(代理)lambda 函数,从而解压缩数据。
lambda 函数(NodeJS 8):
let zlib = require('zlib');
exports.handler = async (event) => {
let decompressedData = zlib.gunzipSync(event['body'])
return {
"statusCode": 200,
"body": decompressedData.toString()
};
};
对于使用 gzip 压缩 example.gz
的某些文件,我通过 URL(通过 API 网关)使用curl 命令来触发它:
curl -X POST --data-binary @example.gz https://URL...
结果,我得到:
{"message": "Internal server error"}
错误是(Cloudwatch 中的日志):
"errorMessage": "incorrect header check",
"errorType": "Error",
"stackTrace": [
"Gunzip.zlibOnError (zlib.js:153:15)",
"Gunzip._processChunk (zlib.js:411:30)",
"zlibBufferSync (zlib.js:144:38)",
"Object.gunzipSync (zlib.js:590:14)",
"exports.handler (/var/task/test_index.js:5:33)"
]
当我查看 event['body']
本身时,我看到的数据与在 example.gz
中看到的完全相同。也许我需要一些特殊的标题?我只想按原样传递数据。
最佳答案
如Michael - sqlbot说,默认情况下,API Gateway 无法将二进制数据传递到 Lambda 函数中。
什么对我有用:
我在curl命令中添加了标题Content-Type: application/octet-stream
,并在API网关设置中,在Binary Media Types
上添加了application/八位字节流
。
这样,数据以 base64 形式传递,然后我只需将 base64 形式的日期转换为缓冲区:
let data = Buffer.from(event['body'], "base64")
然后解压即可。
了解更多信息read here
关于node.js - 解压缩 lambda 中作为二进制数据接收的数据 - 错误的 header 检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55611758/