NodeJS从AWS Lambda函数中流出

时间:2018-11-05 06:10:36

标签: node.js amazon-web-services 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);
  });
};

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

有人有什么想法吗?甚至有可能从Lambda流出吗?

1 个答案:

答案 0 :(得分:3)

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

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

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

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