热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何在Node.js中正确取消http请求?

如何解决《如何在Node.js中正确取消http请求?》经验,为你挑选了1个好方法。

我需要在Node.js中实现可取消的客户端HTTP请求,而不使用外部库。我给一个Promise对象- cancellationPromise当外部请求取消时,该对象被拒绝。这就是我知道我可能需要打电话的方式request.abort()

问题是,request.abort()仅在https.request仍处于挂起状态并且response对象尚不可用时,才应该调用吗?

或者,即使我已经有了response对象并正在处理响应数据,也应该像下面的代码中那样调用它吗?在这种情况下,这会阻止更多response.on('data')事件发生吗?

  async simpleHttpRequest(url, oauthToken, cancellationPromise) {
    let cancelled = null;
    let Oncancel= null;

    cancellationPromise.catch(error => { 
      cancelled = error; oncancel && oncancel(error) });

    try {
      const respOnse= await new Promise((resolve, reject) => {
        const request = https.request(
          url.toString(), 
          { 
            method: 'GET', 
            headers: { 'Authorization': `Bearer ${oauthToken}` }        
          }, 
          resolve);

        Oncancel= error => request.abort();
        request.on('error', reject);
        request.end();
      });

      if (cancelled) throw cancelled;

      // do I need "Oncancel= null" here?
      // or should I still allow to call request.abort() while fetching the response's data?

      // Oncancel= null;

      try {
        // read the response 
        const chunks = await new Promise((resolve, reject) => {
          response.on('error', reject);  
          const chunks = [];
          response.on('data', data => chunks.push(data));
          response.on('end', () => resolve(chunks));
        });

        if (cancelled) throw cancelled;
        const data = JSON.parse(chunks.join(''));
        return data;
      }
      finally {
        response.resume();
      }
    }
    finally {
      Oncancel= null;
    }
  }

Hash.. 6

这取决于您要中止请求来实现的目标。

只是一点背景。HTTP 1无法“取消”它发送的请求,然后等待响应。您无法“回滚”您所做的请求。您需要进行分布式事务。(进一步阅读。)如MDN开发人员文档所述:

如果请求已经发送,则XMLHttpRequest.abort()方法将中止该请求。当请求中止时,其readyState更改为XMLHttpRequest.UNSENT(0),并且请求的状态码设置为0。

基本上,您可以停止响应被应用程序处理。另一个应用程序可能会(如果您abort()在发送给它之后调用了它)仍然完成其处理。

从问题的角度来看:

问题是,request.abort()仅在https.request仍处于挂起状态且响应对象尚不可用时,才应该调用吗?

TL.DR .:仅从您的应用程序角度来看很重要。当我浏览您的代码时,我认为它会很好地工作。



1> Hash..:

这取决于您要中止请求来实现的目标。

只是一点背景。HTTP 1无法“取消”它发送的请求,然后等待响应。您无法“回滚”您所做的请求。您需要进行分布式事务。(进一步阅读。)如MDN开发人员文档所述:

如果请求已经发送,则XMLHttpRequest.abort()方法将中止该请求。当请求中止时,其readyState更改为XMLHttpRequest.UNSENT(0),并且请求的状态码设置为0。

基本上,您可以停止响应被应用程序处理。另一个应用程序可能会(如果您abort()在发送给它之后调用了它)仍然完成其处理。

从问题的角度来看:

问题是,request.abort()仅在https.request仍处于挂起状态且响应对象尚不可用时,才应该调用吗?

TL.DR .:仅从您的应用程序角度来看很重要。当我浏览您的代码时,我认为它会很好地工作。


可以中止HTTP GET或HEAD,但不能中止POST或PUT。一旦呼叫者确实决定中止,他们很可能不希望呼叫任何钩子并承诺被拒绝,因此我想说总是中止。
推荐阅读
author-avatar
mobiledu2502860057
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有