0

この小さなドメイン検索アプリを作成すると、配列内の各項目の .com を順番に検索する必要がありますが、test1 を検索し続けます。検索機能内でコンソール ログを実行しても、x の値が test2 であり、test 3 であることがわかります。リスナーなどを削除する必要がありますか?

次の出力が得られます

 domain test1.com

 Domain Name: TEST1.COM
 domain test2.com

 Domain Name: TEST1.COM
 domain test3.com

 Domain Name: TEST1.COM

app.js

 var port = 43;
 var net = require('net');
 var host = 'whois.internic.net';
 var dotCom = new net.Socket();
 var c = 0;
 var connections = 0;
 var dotComStatus;
 dotCom.setEncoding('ascii');

 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) {
   var q = "domain " + x + ".com\r\n";

   dotCom.connect(port, host, function() {
        dotCom.write(q);
        console.log(q);
        connections++;
   });

   dotCom.on('data', function(data) {
        c++;
        if (c == 2) { 
             dotComStatus = data.split('\n')[1];
             dotCom.on('close', function() {
                  console.log(dotComStatus);
                  connections--;
                  chkconnections();
             });
        }
   });
}   
4

1 に答える 1

1

このコードには明らかな問題がいくつかあります。まず、close イベントを data イベント内に配置するのは悪い考えです。データが受信される前に接続が閉じられた場合、コードのそのセクションに到達することはありません。次は、セクションに大きな問題があります

c++;
if (c == 2)

0 にリセットcしないため、次の行dotComStatus = data.split('\n')[1];は実行されません。しかし、ソケットが閉じて、イベントclosedがトリガーされます。そして、これが再び実行されます。

  console.log(dotComStatus);
  connections--;
  chkconnections();

しかし、 の値は0 に等しかったためdotComStatus、変更されていませんc。NodeJS で一般的なこの接続/データ/終了フローを実行する方法の例は多数あります。

 var port = 43;
  var net = require('net');
  var host = 'whois.internic.net';

  var searches = ['test1', 'test2', 'test3'];
  search(searches.shift());

  function chkconnections(z) {
    if(searches.length > 0)
      search(searches.shift());
  }

  function search(x) {
    var dotCom = new net.Socket();
    dotCom.setEncoding('ascii');
    var q = "domain " + x + ".com\r\n";

    dotCom.connect(port, host, function() {
      dotCom.write(q);
    });

    var data = ""; // holding place until socket closes

    dotCom.on('data', function(chunk) {
      data += chunk; // add chunk to data
    });

    dotCom.on("end", function() {
      // socket closed
      dotComStatus = data.split('\n')[7]; // Should be 'Domain Name: blah'
      console.log(dotComStatus);
      chkconnections(); // move on to next
    });
};
于 2013-07-27T04:52:16.957 に答える