gpt4 book ai didi

express - 无服务器 Express 应用程序在路由内的逻辑完成之前终止

转载 作者:行者123 更新时间:2023-12-05 07:00:26 29 4
gpt4 key购买 nike

我有一个简单的 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 非常乐意在返回响应后继续执行。

知道我的情况出了什么问题吗?

最佳答案

据我所知,目前 Lambda 和 API 网关无法使用此用例,因为从 API 网关对 Lambda 的调用属于 RequestResponse 类型,而不是 AsyncReference

一旦您的代码(在本例中我认为是 serverless-express)调用 context.done(),响应就会从 Lambda 发送到 API 网关,然后Lambda 函数的执行上下文已完成(卡住,在下一次调用中重新使用,或回收到 Lambda 的底层基础设施中)。

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

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

关于express - 无服务器 Express 应用程序在路由内的逻辑完成之前终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64127315/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com