express - 无服务器快速应用程序在路由中的逻辑完成之前终止
问题描述
我有一个使用无服务器框架托管在 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 非常乐意在返回响应后继续执行。
任何想法在我的情况下出了什么问题?
解决方案
我会说 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
推荐阅读
- python - 如何将numpy矩阵的元素扩展为子矩阵
- javascript - redux-saga:函数被调用两次
- typo3 - 在多站点 TYPO3 安装中进行站点特定配置的最佳方式是什么?
- excel - 定义变量以设置 pdf 的动态位置和文件名以查找打开的
- wordpress - 木材加载 jQuery 的 http 版本导致混合内容问题?
- azure-devops - 希望在自托管代理上运行大门
- python - 图像变形场的 B 样条插值
- docker - Hyperledger Fabric - 无法使用四个 Kafka 和三个 Zookeeper Ensemble 启动网络
- sql - 需要在 T-SQL 中验证二进制数字的值
- mysql - 从另一个表中选择插入的mysql过程