【问题标题】:How can I write a Lambda function in node.js that returns binary data?如何在 node.js 中编写返回二进制数据的 Lambda 函数?
【发布时间】:2019-11-06 20:41:01
【问题描述】:

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

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

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

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

【问题讨论】:

  • Lambda 函数是指 aws lambda 吗?谁在呼唤它?你在用 api 网关吗?
  • 是的,它是一个 AWS Lambda 函数,是的,我们正在使用 API Gatway。客户端是一个 iOS 应用程序。
  • 你想返回什么样的二进制数据?
  • 一个八位字节流(即字节流)

标签: node.js lambda


【解决方案1】:

我认为您有两个选择,返回 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
    }
}

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

您可能需要配置 API Gateway 以允许 */* 媒体类型。 Here is an article with more details.

S3 重定向

另一个对大型二进制对象更有意义的选项是将二进制对象作为文件写入 S3,然后返回带有重定向 url 的 statusCode: 302a signed S3 url

类似这样的:

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

【讨论】:

  • 感谢您的回复。我们决定使用 base64 方法。
猜你喜欢
  • 2017-12-05
  • 2014-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-19
  • 1970-01-01
  • 2020-04-04
  • 1970-01-01
相关资源
最近更新 更多