1

我正在编写一个域搜索应用程序,我一直很简单地检查 .com 域的可用性。它的基础工作正常,问题是当我有多个请求时,特别是多个搜索()它给了我一个错误

 { [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 searches = ['test1', 'test2', 'test3'];

search(searches.shift()); 

function chkconnections(z) {
     if (connections <= 0) {
         if (searches.length >= 1) {
            process.nextTick(function() {
                 search(searches.shift());
            });
         }
     }
 }

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

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

1 回答 1

2

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

其他问题:您正在使用尚未声明或初始化的变量。严格模式可以帮助捕捉这些问题(注意“使用严格”;在顶部添加。

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

如果你重构你的代码,在搜索方法中移动新的 Socket 和 on('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]);
    }
}

并修改您的搜索功能以接受此类参数。

于 2013-07-26T04:16:10.830 回答