node.js - 解压缩 lambda 中作为二进制数据接收的数据 - 错误的 header 检查

标签 node.js curl post aws-lambda gzip

我想将压缩数据 (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/

相关文章:

php - 使用代理安全吗?

php - 如何在php中获取http请求来源

java - 通过 HTTP Post (Java) 发送 csv 文件及其 md5 哈希值

javascript - 我正在将 ytdl-core 用于音乐机器人,它一直输出播放未定义

javascript - 文档内的 mongoDB 数组

curl - 通过公共(public) API 访问 Google Cloud Storage 存储桶的正确方法

ruby-on-rails - 在 Windows 中设置 Curb

c++ - Node 配置文件中的 ___mac_get_pid 符号是什么?

linux - 无法找到包 Node 遗留

python - 为什么使用带有 post 的表单在 python 中发送图像不起作用