【问题标题】:Serverless express app terminates before logic within route has completed无服务器快速应用程序在路由中的逻辑完成之前终止
【发布时间】:2021-01-15 12:28:34
【问题描述】:

我有一个简单的 Express 应用,托管在 AWS 上,使用无服务器框架。

我使用 serverless-http 包装 express 应用程序以部署到 AWS lambda 函数,并使用 express-async-await 允许对路由使用异步函数。

对于我的一条路线,我想向用户返回一个页面,然后继续执行各种异步任务。这是我的代码的缩写版本:

const serverless = require("serverless-http");
const express = require("express");
const mustacheExpress = require("mustache-express");
const aa = require("express-async-await");

// configure our express app
const app = aa(express());
app.use(express.static("static"));
app.engine("html", mustacheExpress());
app.set("view engine", "html");
app.set("views", __dirname + "/views");
app.get("/", async (request, response) => {

  response.render("generating", {  });

  // various async tasks
  await s3.putObject({ });
  await s3.putObject({ });

});

module.exports.handler = serverless(app);

但是,通过检查日志,我可以看到response.render 之后的任务在中途停止。 lambda 没有错误地返回,没有超时,但任务已停止。

response.render 移动到路由的末尾意味着异步任务被执行,但是,用户看到的是一个微调器而不是呈现的 HTML 保存页面。

通过阅读,我发现许多参考资料表明 Express 非常乐意在返回响应后继续执行。

任何想法我的情况出了什么问题?

【问题讨论】:

    标签: express serverless-framework


    【解决方案1】:

    据我所知,Lambda 和 API Gateway 目前无法使用此用例,因为从 API Gateway 对 Lambda 的调用是 RequestResponse 类型,而不是 Async 类型。 Reference

    一旦您的代码(在本例中我认为是 serverless-express)调用 context.done(),响应就会从 Lambda 发送到 API Gateway,并且 Lambda 函数的执行上下文完成(或者冻结,或者重新用于下一次调用,或回收到 Lambda 的底层基础设施中)。

    有几个选项可以调用新函数以继续处理,因此您的 API 可以返回给用户:

    • 将消息发布到 SNS 主题和/或 SQS 队列并构建第二个 lambda 来处理消息
    • 使用 Step Functions
    • 使用 AWS-SDK 直接调用第二个函数

    【讨论】:

      【解决方案2】:

      我会说 AWS lambda 函数在响应写入后终止执行。

      ¿您是否在 S3 中使用了 Promise?要上传的代码不应该是:

      await s3.putObject({ }).promise();
      

      试试看。但是,我还建议将response.render 移到路线的末尾并从前端处理事情。例如:

      // show spinner
      
      // make AJAX request and handle the result asynchronously, for example, assuming you are using axios:
      axios.get(url).then(data => {
        // show result to the user
      })
      
      // hide spinner and show other HTML while the request finishes
      

      【讨论】:

        猜你喜欢
        • 2021-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-17
        • 1970-01-01
        • 1970-01-01
        • 2017-09-27
        • 1970-01-01
        相关资源
        最近更新 更多