首页 > 解决方案 > 如果客户端在 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);
});

如果请求以任何方式被取消,即它接收到cancelcloseabort事件,是否可以中止这个 rest API 中的所有进一步进程?

标签: node.jsexpress

解决方案


没有取消任何异步函数的通用方法,因此如果您只看到一个,您将需要深入了解该函数,看看他们是否有一些工具可以取消该过程。await

例如,为什么是createPdf异步的?也许它调用了一个外部进程?你可以杀死那个进程。也许它调用了第 3 方 API?取消 HTTP 请求。

可以取消的基于 promise 的 API 的一个很好的例子是 fetch,它使用AbortController. 这也是应用到您自己的函数的一个很好的模式,但是您需要显式(主要是手动)为要添加取消支持的任何函数为此编写代码。


推荐阅读