AWS Lambda函数外的NodeJS流

blpfk2vs  于 2023-02-08  发布在  Node.js
关注(0)|答案(2)|浏览(245)

我们正在尝试将我们的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流出来?

55ooxyrt

55ooxyrt1#

不幸的是,lambda不支持流作为事件 * 或 * 返回值。(很难在文档中找到明确提到它的地方,除非注意到documentation中对调用和上下文/回调的描述)。
在您的示例中,必须等待streamFiles,然后返回完整的结果。
aws-serverless-express在这里帮不上忙,如果你检查代码,他们会等你的管道完成后再返回:https://github.com/awslabs/aws-serverless-express/blob/master/src/index.js#L68)

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

cqoc49vn2#

有同样的问题,现在确定如何通过本地lambda + API网关直接进行流/管道...但这在技术上是可能的。
我们使用了Serverless Framework,并且能够通过此初学者工具包(https://github.com/serverless/examples/tree/v3/aws-node-express-dynamodb-api)使用XX.pipe(res)
有趣的是,这只是 Package 了原生lambda + API网关,所以,从技术上讲,这是可能的,因为他们已经做到了。
祝你好运

相关问题