2013-07-26 28 views
1

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

{ [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"); 
       } 
      }); 
     } 
    }); 
} 

回答

2

你的代码结构的方式,你只有一个插座,您试图调用四次连续连接就可以了。这是你问题的根源。

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

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

如果你调整你的代码,移动新的Socket和搜索方法中(“数据”)的逻辑,你会看到一个更好的结果

事情是这样的:

"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"); 
       } 
      }); 
     } 
    }); 
} 

稍有变化,在s中搜索的逻辑通过只在第一次完成后才启动下一次搜索来发挥作用。

"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()); 

如果你想搜索多个顶级域名的你可以不喜欢每个二级域名:

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]); 
    } 
} 

和修改您的搜索功能来接受这种类型的参数。

+0

如果我在搜索功能中为.net和.org添加一个.connect,使得它每次运行该函数都有三个连接,并且我有多个搜索,它会抛出一个Error:read ECONNRESET。解决这个问题的最佳做法是什么? – archytect

+0

可能有许多不同的方法来做到这一点。一种简单的方法是将查询放入数组中,然后在完成时调用search(arr。shift()),直到数组为空。 (查看更新后的代码) – dc5

+0

最后一条评论回答了编辑前的问题。不知道你的代码在你尝试时看起来是什么样的,但是听起来好像你只是把它放入了它之前(或类似的)的状态。没有必要尝试在搜索功能中做更多的工作。稍微重构一下代码,以便您可以使用不同的顶级域名调用搜索功能。 – dc5