首页 > 解决方案 > 无服务器快速应用程序在路由中的逻辑完成之前终止

问题描述

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

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 非常乐意在返回响应后继续执行。

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

标签: expressserverless-framework

解决方案


我会说 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

推荐阅读