Nodejs http get 请求没响应,求助
Nodejs http get 请求没响应,求助
function requestUrl(url,dic_info,callBack){ var http = require(‘http’); console.log(url); http.get(url,function(res){ console.log(’+++++++++++++++++++’); if (res.statusCode>= 200 || res.statusCode < 299) { callBack(dic_info,1); } else{ callBack(dic_info,0); }
counter++;
}).on('error',function(e){
console.log('--------------------');
callBack(dic_info,0);
counter++;
});
}
然后我在一个for循环中调用了这个方法来检查url是否有用 ,第一次发送的几个请求,全部有响应,然后我在浏览器上刷新下(两次的地址都是一样的),这时只有两个地址有响应,后面的地址也没error,一直没响应。但是重启下就好了。
Node.js HTTP GET 请求没响应,求助
问题描述
最近在使用 Node.js 进行 HTTP GET 请求时遇到了一个问题:在循环中多次发送请求时,某些请求会没有响应。即使请求没有出错,也没有返回任何数据。这导致了程序的阻塞,直到请求超时。
示例代码
首先,我们来看一下你提供的代码片段:
function requestUrl(url, dic_info, callBack) {
var http = require('http'); // 使用标准库中的 http 模块
console.log(url);
http.get(url, function (res) {
console.log('+++++++++++++++++++');
if (res.statusCode >= 200 && res.statusCode < 299) {
callBack(dic_info, 1); // 请求成功
} else {
callBack(dic_info, 0); // 状态码不在200-299之间
}
}).on('error', function (e) {
console.log('--------------------');
callBack(dic_info, 0); // 发生错误
});
}
问题分析
从你的描述来看,问题可能与 Node.js 的事件循环和资源管理有关。每次请求都会创建一个新的 http.get
请求,并且这些请求会在内存中累积,可能会导致资源耗尽或网络连接被阻塞。
解决方案
建议使用 https
模块代替 http
模块,因为大多数现代 API 都支持 HTTPS。同时,可以使用 axios
或 node-fetch
这样的第三方库来处理 HTTP 请求,它们提供了更强大的功能和更好的错误处理机制。
以下是使用 axios
的示例代码:
const axios = require('axios');
async function requestUrl(url, dic_info) {
try {
const response = await axios.get(url);
if (response.status >= 200 && response.status < 300) {
return { success: true, data: dic_info };
} else {
return { success: false, data: dic_info };
}
} catch (error) {
console.error('Error:', error.message);
return { success: false, data: dic_info };
}
}
// 在循环中调用
(async () => {
const urls = ["http://example.com", "http://example.org"];
for (let url of urls) {
const result = await requestUrl(url, { key: 'value' });
console.log(result);
}
})();
解释
- 异步函数:使用
async/await
来处理异步操作,使代码更简洁易读。 - axios 库:
axios
是一个流行的 HTTP 客户端,它提供了更好的错误处理和更丰富的功能。 - 循环调用:在循环中调用
requestUrl
函数,并等待每个请求完成后再继续下一个请求。
通过这种方式,可以更好地管理和控制多个 HTTP 请求,避免资源耗尽和请求阻塞的问题。希望这能解决你的问题!
虽然没有用过,个人感觉是连接池的问题,res数据没有接收,造成连接不能释放,http默认的连接池是5个,请求同一个主机超过5个就挂起了吧,哈哈
根据你的描述,问题可能是由于HTTP客户端没有正确处理并发请求导致的。在Node.js中,http.get()
默认使用全局的http.globalAgent
,该代理可能会限制并发连接数。当达到最大并发连接数时,后续的请求可能会被阻塞或延迟。
你可以尝试调整HTTP客户端配置,增加最大并发连接数,或者使用https
模块(如果你访问的是HTTPS URL)来代替http
模块。此外,还可以添加错误处理和超时机制以确保请求不会无限期地挂起。
示例代码
const https = require('https');
function requestUrl(url, dic_info, callback) {
const options = {
hostname: new URL(url).hostname,
path: new URL(url).pathname,
method: 'GET',
timeout: 5000 // 设置超时时间为5秒
};
const req = https.request(options, (res) => {
console.log('Response received');
if (res.statusCode >= 200 && res.statusCode < 300) {
callback(dic_info, 1);
} else {
callback(dic_info, 0);
}
});
req.on('error', (e) => {
console.error(`Request error: ${e.message}`);
callback(dic_info, 0);
});
req.on('timeout', () => {
console.error('Request timed out');
req.abort();
callback(dic_info, 0);
});
req.end();
}
// 在for循环中调用
for (let i = 0; i < urls.length; i++) {
requestUrl(urls[i], { key: 'value' }, (dic_info, status) => {
console.log(`Callback for ${urls[i]} with status ${status}`);
});
}
解释
- 超时设置:通过
timeout
选项设置了请求的超时时间,如果请求超过指定时间未完成,则会触发超时事件。 - 错误处理:增加了对错误事件的监听,确保在请求出错时能够及时回调。
- 全局代理调整:通过使用
https
模块并手动设置options
对象,可以更好地控制HTTP请求行为。
以上代码应该能解决你在实际应用中遇到的问题。希望这对你有所帮助!