我们正在尝试将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流出吗?
答案 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发出的流。