如何在 node.js 中编写返回二进制数据的 Lambda 函数?

use*_*238 4 lambda node.js

我想在 node.js 中编写一个返回二进制数据的 Lambda 函数。我希望响应标头为“application/octet-stream”,但这并不是绝对必要的。

响应头似乎始终是“application/json”,并且没有任何方法可以更改它。

回调函数的文档说:“回调函数有两个参数:一个错误和一个响应。响应对象必须与 JSON.stringify 兼容。”

我不希望任何人“字符串化”我的数据或将其转换为 JSON。我只想按原样返回字节缓冲区。

jus*_*ase 8

我认为您有两个选择,返回一个 base64 编码的字符串或重定向到包含二进制 blob 的 S3。

您的响应始终是 JSON 对象,但您可以指定内容类型,并且可以使用 base64 进行编码以通过 API Gateway 发送二进制数据。

Base64 编码

在不太了解您的代码的情况下,请考虑以下示例:

exports.handler = async (event) => {
    const result = Buffer.from('Hello World!', 'utf8')
    return {
      statusCode: 200,
      headers: {
        'Content-Type': 'application/octet-stream'
      },
      body: result.toString('base64'), // SGVsbG8gV29ybGQh
      isBase64Encoded: true
    }
}
Run Code Online (Sandbox Code Playgroud)

您返回一个对象,但指定主体是一个 base64 编码的字符串,API Gateway 应将其转换为八位字节流。

您可能需要配置 API Gateway 以允许*/*媒体类型。这是一篇包含更多详细信息的文章

S3 重定向

另一种选择对于大型二进制对象更有意义,即将二进制对象作为文件写入 S3,然后返回statusCode: 302带有重定向 url的签名 S3 url

像这样的东西:

exports.handler = async (event) => {
    return {
      statusCode: 302,
      headers: {
        'Location': 'http://example.com/example.png'
      }
    }
}
Run Code Online (Sandbox Code Playgroud)