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,一直没响应。但是重启下就好了。


3 回复

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。同时,可以使用 axiosnode-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);
    }
})();

解释

  1. 异步函数:使用 async/await 来处理异步操作,使代码更简洁易读。
  2. axios 库axios 是一个流行的 HTTP 客户端,它提供了更好的错误处理和更丰富的功能。
  3. 循环调用:在循环中调用 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请求行为。

以上代码应该能解决你在实际应用中遇到的问题。希望这对你有所帮助!

回到顶部