我们正在尝试将我们的 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 吗?
最佳答案
不幸的是,lambda 不支持流作为事件或返回值。 (很难在文档中明确提及它,除非注意在工作 documentation 中如何描述调用和上下文/回调)。
对于您的示例,您必须等待 streamFiles
,然后返回完成的结果。
(aws-serverless-express
在这里无济于事,如果您检查代码,它们会等待您的管道在返回之前完成:https://github.com/awslabs/aws-serverless-express/blob/master/src/index.js#L68)
注意这里有一个细微差别,许多语言 SDK 支持流式传输请求/响应,但这意味着连接到流传输,例如流从 lambda 下载完整的响应,而不是监听从 lambda 发出的流。
关于node.js - NodeJS 流出 AWS Lambda 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53149186/