多个nodejs请求实时搜索

时间:2013-07-26 01:00:02

标签: 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; // 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");
                }
            });
        }
    });
}   

1 个答案:

答案 0 :(得分: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]);
    }
}

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