2013-07-26 27 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