NodeJS 流出 AWS Lambda 函数

Hrv*_*tić 6 amazon-web-services node.js express aws-lambda

我们正在尝试将我们的 zip 微服务从 nodejs Express 中的常规应用程序迁移到与 AWS Lambda 集成的 AWS API Gateway。
我们当前的应用程序向我们的 API 发送请求,获取附件列表,然后访问这些附件并将其内容以 zip 存档的形式返回给用户。它看起来像这样:

module.exports = function requestHandler(req, res) {

  //...
  //irrelevant code
  //...

  return getFileList(params, token).then(function(fileList) {
    const filename = `attachments_${params.id}`;
    res.set('Content-Disposition', `attachment; filename=${filename}.zip`);

    streamFiles(fileList, filename).pipe(res); <-- here magic happens
  }, function(error) {
    errors[error](req, res);
  });
};
Run Code Online (Sandbox Code Playgroud)

除了必须从 Lambda 函数中传输内容的部分之外,我已经设法完成了所有工作。
我认为可能的解决方案之一是使用 aws-serverless-express,但我想要一个更优雅的解决方案。

任何人有任何想法?甚至可以从 Lambda 中流出吗?

tho*_*ace 9

不幸的是,lambda 不支持流作为事件或返回值。(很难在文档中找到明确提及它,除非注意工作文档中如何描述调用和上下文/回调)。

在您的示例中,您将不得不等待streamFiles,然后返回完成的结果。

(aws-serverless-express在这里无济于事,如果您检查他们等待管道完成后再返回的代码:https : //github.com/awslabs/aws-serverless-express/blob/master/src/index.js#L68)

nb 这里有一个细微差别,许多语言 SDK 支持请求/响应的流式传输,但这意味着连接到流传输,例如从 lambda 下载完整响应的流,而不是监听从 lambda 发出的流。