当前位置: 首页 > 知识库问答 >
问题:

AWS Lambda函数外的NodeJS流

谢雅珺
2023-03-14

我们正在尝试将我们的 zip 微服务从节点js Express 中的常规应用程序迁移到与 AWS Lambda 集成的 AWS API 网关。
我们当前的应用程序向我们的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函数中流出来的部分,我已经设法完成了所有的工作。< br >我认为可能的解决方案之一是使用aws-serverless-express,但我更喜欢更优雅的解决方案。

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

共有1个答案

柴嘉禧
2023-03-14

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

在您的示例中,您必须等待< code>streamFiles,然后返回完整的结果。

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

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

 类似资料:
  • 我正在尝试构造这段代码,这样我就可以从多个地方调用getStudent。我正在尝试编写一些JSON例程。我正在尝试错误的第一回调模式。我不是因为这个错误而感到不安,而是因为这个错误被getstudent中的一个捕获器捕获了。 顺便说一句,我发现错误是做状态(200)而不是状态(0)。 我应该如何重新构造这些捕获,使它们不影响主代码?还是我完全误用了回调的概念?似乎“then/catch”是使用MS

  • SyntaxError:无效或意外的令牌第5行我似乎找不到缺少什么或语法错误的地方

  • 函数执行时间过长。尝试使用await异步函数,但没有效果。返回未定义,因为不等待。 我有我的index.js: 和我的signupapi.js: 这是运行index.js并调用时的节点输出: 我当前在DB中有37个具有相同数据的条目,因此返回37。 但这是最后执行的,并且出现在控制台的底部,而它应该出现在顶部。

  • 通过数据类,我们可以方便地得到很多有趣的函数,一部分是来自属性,我们之前已经讲过(从编写getter和setter函数): equals(): 它可以比较两个对象的属性来确保他们是相同的。 hashCode(): 我们可以得到一个hash值,也是从属性中计算出来的。 copy(): 你可以拷贝一个对象,可以根据你的需要去修改里面的属性。我们会在稍后的例子中看到。 一系列可以映射对象到变量中的函数。

  • 使聊天应用程序通过Node in action引用,并在运行server.js时,得到以下错误:function serveStatic(response,cache,absPath)^^^^^^^^^^^^syntaxerror:exports.runinthiscontext(VM.JS:73:16)在module._compile(module.js:543:28)在object.modul

  • 我有一个受IAM授权保护的API,它是一个资源策略,允许IAM用户调用API。 现在我想写一个lambda函数来调用同一个API。假设我可以访问IAM访问密钥和密码(通过环境变量或AWS Secret Manager),我如何对用户进行IAM授权,以便它可以成功地调用API? 用于调用相同API的示例代码(未经IAM授权):