Node.js 多个nodejs请求实时搜索

Node.js 多个nodejs请求实时搜索,node.js,Node.js,我正在编写一个域搜索应用程序,我只需检查.com域的可用性即可。它的基本原理很好,问题是当我有多个请求,特别是多个search()时,它会给我一个错误 { [Error: connect Unknown system errno 37] code: 'Unknown system errno 37', errno: 'Unknown system errno 37', syscall: 'connect' } events.js:72 throw er; /

我正在编写一个域搜索应用程序,我只需检查.com域的可用性即可。它的基本原理很好,问题是当我有多个请求,特别是多个search()时,它会给我一个错误

 { [Error: connect Unknown system errno 37]
  code: 'Unknown system errno 37',
  errno: 'Unknown system errno 37',
  syscall: 'connect' }


 events.js:72
         throw er; // Unhandled 'error' event
          ^
 Error: connect Unknown system errno 37
     at errnoException (net.js:863:11)
     at connect (net.js:726:19)
     at net.js:804:9
     at asyncCallback (dns.js:68:16)
    at Object.onanswer [as oncomplete] (dns.js:121:9)
我需要更改或添加什么才能使其正常工作?事件?排队

(为dc5编辑)

var搜索=['test1','test2','test3'];
搜索(searches.shift());
函数chkconnections(z){
如果(连接=1){
process.nextTick(函数(){
搜索(searches.shift());
});
}
}
}
函数搜索(x){
connect(端口、主机、函数(){
.write('domain'+x+'.com\r\n');
计数++;
连接++;
});
com.on('data',函数(data){
C++;
如果(c==2){
dotComStatus=data.split('\n')[1];
com.on('close',function(){
联系--;
chkconnections();
计数--;
if(dotComStatus.indexOf(“域不匹配”)>-1)
{
console.log(x+“.com可用”);
}否则{
console.log(取x+”.com“);
}
});
}
});
}   

按照代码的结构,您只有一个套接字,并且尝试连续四次调用connect。这是你问题的根源

其他问题:您正在使用尚未声明或初始化的变量。严格模式有助于解决此类问题(请注意顶部的“use Strict”;addition)

传回的数据是一个缓冲区-在对其使用string方法之前,需要将其转换为字符串

如果重新构造代码,在搜索方法中移动新套接字和('data')逻辑,您将看到更好的结果

大概是这样的:

"use strict";

var port = 43;
var net = require('net');
var host = 'whois.internic.net';

search('test');
search('test1');
search('test2');
search('test3');

function search(x) {
    var dotCom = new net.Socket();

    dotCom.connect(port, host, function() {
        dotCom.write('domain ' + x + '.com\r\n');
    });

    var c = 0;
    var dotComStatus;

    dotCom.on('data', function(data) {
        c++;
        if (c == 2) {
            dotComStatus = data.toString().split('\n')[1];
            dotCom.on('close', function() {
                if (dotComStatus.indexOf("No match for domain") > -1) {
                    console.log("available");
                } else {
                    console.log("taken");
                }
            });
        }
    });
}
只需稍作更改,即可通过在第一次搜索完成后启动下一次搜索来按顺序进行搜索的逻辑

"use strict";

var port = 43;
var net = require('net');
var host = 'whois.internic.net';

var searches = [
    "test",
    "test1",
    "test2",
    "test3"
];


function search(x) {
    var dotCom = new net.Socket();

    dotCom.connect(port, host, function() {
        dotCom.write('domain ' + x + '.com\r\n');
    });

    var c = 0;
    var dotComStatus;

    dotCom.on('data', function(data) {
        c++;
        if (c == 2) {
            dotComStatus = data.toString().split('\n')[1];
            dotCom.on('close', function() {
                if (dotComStatus.indexOf("No match for domain") > -1) {
                    console.log("available");
                } else {
                    console.log("taken");
                }

                if(searches.length === 0) return;

                process.nextTick(function() {
                    search(searches.shift()); 
                });
            });
        }
    });
}

search(searches.shift());
如果要为每个二级域搜索多个TLD,可以执行以下操作:

var tlds = ['.net', '.com', '.org'];
var names = ['test', 'test1', 'test2'];

for(var i = 0; i < names.length; ++i) {
    for(var j = 0; j < tlds.length; ++j) {
        search(names[i] + tlds[j]);
    }
}
var tlds=['.net'、'.com'、'.org'];
变量名称=['test','test1','test2'];
对于(变量i=0;i

并修改搜索函数以接受此类型的参数。

如果我在搜索函数中为.net和.org添加.connect,使其每次运行三个连接,并且我有多个搜索,则会抛出一个错误:read ECONNRESET。解决此问题的最佳做法是什么?可能有许多不同的方法一种简单的方法是将查询放入一个数组中,然后在完成时调用搜索(arr.shift()),直到数组为空最后一条评论是在您编辑之前对问题的回答。不确定您尝试编辑时的代码是什么样子的,但听起来您只是将其置于之前的状态(或类似状态)。无需尝试在搜索函数中执行更多工作。请稍微重构代码,以便可以使用不同的顶级域调用搜索函数。我已更新了原始帖子的代码。process.nextTick()这是我一直在寻找的。但是你的例子中,你在关闭套接字时就有了。如果函数本身处理三个套接字,我将如何重构它?有几个建议:1.如果你想一次处理三个未完成的请求,你需要一种启动请求的方法,以及一种跟踪它们何时有com的方法已完成(思考回调)。2.决定是在返回结果时返回结果,还是等到结果全部完成。3.思考可能需要处理的任何其他用例。4.思考如何使代码更加枯燥(即:减少重复)。有很多方法可以构建解决方案,可以尝试一些方法,看看哪些方法适合您的风格。
var tlds = ['.net', '.com', '.org'];
var names = ['test', 'test1', 'test2'];

for(var i = 0; i < names.length; ++i) {
    for(var j = 0; j < tlds.length; ++j) {
        search(names[i] + tlds[j]);
    }
}