node.js - 如果客户端在 NodeJs 之间取消请求,则停止进一步的执行过程
问题描述
我正在我的 NodeJs 服务器上使用 puppeteer、cheerio 和 pdfkit 创建网站的 pdf,这需要花费大量时间,现在我想在客户端取消请求(即关闭浏览器、选项卡等)时中止所有进程,以便服务器不会处理不必要的进程。例如:
app.get("/api/processScreenshot/:url", async (req, resp) => {
const links = await collectAllLinks(url);
const screenshotsPath = await takeScreenshots(links);
const pdfPath = await createPDF(screenshotsPath);
resp.status(200).end(pdfPath);
});
如果请求以任何方式被取消,即它接收到cancel、close或abort事件,是否可以中止这个 rest API 中的所有进一步进程?
解决方案
没有取消任何异步函数的通用方法,因此如果您只看到一个,您将需要深入了解该函数,看看他们是否有一些工具可以取消该过程。await
例如,为什么是createPdf
异步的?也许它调用了一个外部进程?你可以杀死那个进程。也许它调用了第 3 方 API?取消 HTTP 请求。
可以取消的基于 promise 的 API 的一个很好的例子是 fetch,它使用AbortController
. 这也是应用到您自己的函数的一个很好的模式,但是您需要显式(主要是手动)为要添加取消支持的任何函数为此编写代码。
推荐阅读
- firebase - 我可以使用 Firebase 云制定计划吗
- javascript - Discord.js 错误:它正在删除整个数组。Quick.db 和 discord.js
- angular - 如何在有角度但使用客户端凭据授予流程的情况下使用 azure 服务?
- pandas-bokeh - 散景代码打开弹出窗口,在按钮单击时显示数据表
- database - 什么是 Sybase/Officewyse/SQLanywhere 主客户端?
- python - Python Web Scraping 相同的类
- java - 在控制台中将多个字符串模式打印到一行中
- intellij-idea - 最佳文件更新工作流程?
- node.js - MongoDB 的 JSON 输入
- php - 为什么我的会话变量不起作用?