gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 04:14:18 25 4
gpt4 key购买 nike

我需要在不使用外部库的情况下,在 Node.js 中实现可取消的客户端 HTTP 请求。我正在提供一个 Promise 对象 - cancellationPromise - 当外部请求取消时它会被拒绝。这就是我知道我可能需要调用 request.abort() 的方式。

问题是,仅当 https.request 仍未决且 response 时,我是否应该调用 request.abort()对象还不可用?

或者,即使我已经获得了 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;
}
}

最佳答案

这取决于您希望通过中止请求实现什么。

只是一点背景。 HTTP 1 无法“取消”它发送的请求然后等待响应。您不能“回滚”您所做的请求。您需要一个分布式事务来这样做。 ( Further reading. ) 作为 MDN developer document states :

The XMLHttpRequest.abort() method aborts the request if it has already been sent. When a request is aborted, its readyState is changed to XMLHttpRequest.UNSENT (0) and the request's status code is set to 0.

基本上,您可以阻止应用处理响应。其他应用程序可能(如果您在将它发送给它后调用 abort())无论如何都会完成其处理。

从问题的 Angular 来看:

The question is, should I be calling request.abort() only if https.request is still pending and response object is not yet available?

TL.DR.:仅从您的应用程序的 Angular 来看才重要。当我浏览您的代码时,我认为它可以正常工作。

关于javascript - 如何在 Node.js 中正确取消 http 请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56541796/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com