Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 当发送大量请求时,Nodejs请求ETIMEDOUT_Node.js_Request - Fatal编程技术网

Node.js 当发送大量请求时,Nodejs请求ETIMEDOUT

Node.js 当发送大量请求时,Nodejs请求ETIMEDOUT,node.js,request,Node.js,Request,我每50毫秒发送一个请求(每秒20个请求),以获取站点主体,但在执行20-30秒后,我在每个请求中都会得到错误提示。我已经设置了process.env.UV\u THREADPOOL\u SIZE=128 我已尝试将THREADPOOL_SIZE设置为大于128的值 for(let i in urls) { setTimeout(function() { getBody(i); //It is function with a request

我每50毫秒发送一个请求(每秒20个请求),以获取站点主体,但在执行20-30秒后,我在每个请求中都会得到错误提示。我已经设置了
process.env.UV\u THREADPOOL\u SIZE=128

我已尝试将THREADPOOL_SIZE设置为大于128的值

    for(let i in urls) {
        setTimeout(function() {
            getBody(i); //It is function with a request
        },50*i);
    }
包:请求


请帮帮我,我想在一秒钟内发送大量请求。

UV\u线程池的大小是128,所以你不能增加它通过这个数字

其默认大小为4,但可以在启动时通过 将UV_THREADPOOL_SIZE环境变量设置为任意值( 绝对最大值为128)

其次,
请求
模块中没有
超时
属性,正确的属性名称是:
超时

如果在同一台服务器上并行运行多个请求,则将其设置为3000可能太低,特别是当服务器无法处理那么多请求时

这可能是您收到如此多超时错误的原因之一。所以首先增加这个数字,看看你是否仍然超时

其次,有两种不同类型的超时:

有两种主要类型的超时:连接超时和读取超时 暂停。如果在连接过程中遇到超时,则会发生连接超时 客户端正在尝试建立到远程计算机的连接 (对应于套接字上的connect()调用)。读取超时 在服务器速度太慢无法发回部分数据时发生 答复

执行以下操作可以检查超时是否为连接超时:

if(err.connect === true) // connection timeout.

此外,如果您正在访问同一个域,为了提高速度并减少超时次数,您可以解析IP地址,并直接使用IP访问服务器

我没有测试脚本,但它是为了向您展示如何操作,可能需要进行一些小的修改


您还应该限制请求,因为您可能正在淹没自己的网络。如果在VPS上尝试此操作,可能会比在本地计算机上运行脚本获得更少的超时

例如,在AWS上,有一些网络优化实例更适合发出大量请求,使用其中一个实例将允许您发出比在本地计算机上更成功的请求


因此,这要么是您自己的网络的限制,要么是您向其发出请求的服务器的限制,在这两种情况下,您都需要对请求进行限制以避免错误。

您可能会使服务器过载,或者由于请求过多而受到限制。Show
getBody
,我们需要了解您是如何发出请求的,哪个模块,您传递的参数是什么,请求的超时设置是什么。您可能会出现该错误的原因有多种。还显示堆栈跟踪,因为它可能是连接超时,也可能是读取超时。我已上载代码。不,我刚刚将库更改为axios,此库中不会出现此问题。
if(err.connect === true) // connection timeout.
const dns = require('dns');
const { promisify } = require('util');
const URL = require('url');
const dnsResolve = promisify(dns.resolve);


const ipCache = {};

async getIP(host) {

    // Use LRU cache with expiration...

    if(ipCache[host]) // If it's set, it's either the resolved IP or dnsResolve Promise
        return ipCache[host];

    ipCache[host] = dnsResolve(host);

    const [ip] = await ipCache[host]; // Wait until the promise is resolved

    ipCache[host] = ip;

    return ip;
}

async getBody(url) {

    const { host } = new URL(url);


    const ip = await getIP(host);

    // Build the URL using the IP address instead of the domain
    request( /* ... */)
}