我正在编写一个域名搜索应用,我只是简单地检查.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");
}
});
}
});
}
答案 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]);
}
}
并修改搜索功能以接受此类参数。