【问题标题】:Stop further execution process if client cancels request in between in NodeJs如果客户端在 NodeJs 之间取消请求,则停止进一步的执行过程
【发布时间】:2021-04-27 13:47:35
【问题描述】:

我正在我的 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 事件?

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    没有通用方法可以取消any异步函数,所以如果你只看到await,你需要深入到函数中看看他们是否有一些设施来取消这个过程。

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

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

    【讨论】:

    • 如果这些是一些同步调用,比如说一些繁重的计算,我知道大多数基于 Promise 的 API 都提供中止或终止事件,但是如果有人故意拨打电话然后在两者之间取消请求怎么办,并且请求正在做一些计算工作,这会使我的服务器忙于实际用户/用例。
    • @SandeepRathi 你不能真正中断同步函数。 其他东西要中断它,它必须是异步的。只要同步函数在 Javascript 中运行,在完成之前不会执行其他 javascript 代码。
    • 除非它完全在单独的进程中运行,或者在 webworker 中运行。
    猜你喜欢
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    • 2014-10-11
    • 2021-08-15
    • 1970-01-01
    • 2021-05-22
    • 1970-01-01
    相关资源
    最近更新 更多