40

Raspberry PiにNodeJSをインストールしましたが、rPiがNodeJを介してインターネットに接続されているかどうかを確認する方法はありますか?

4

10 に答える 10

50

簡単で汚い方法は、ノードが解決できるかどうかを確認することwww.google.comです。

require('dns').resolve('www.google.com', function(err) {
  if (err) {
     console.log("No connection");
  } else {
     console.log("Connected");
  }
});

これは、RaspPi がインターネットに接続されていてwww.google.comも、何らかの理由で解決できない可能性があるため、完全に確実というわけでerr.typeはありません。ダウンしてください」)。

于 2013-03-07T12:48:59.873 に答える
17

少し前にNodeJSアプリで似たようなものを構築しなければなりませんでした。私が行った方法は、最初にnetworkInterfaces()関数を OS モジュールとして使用し、次に 1 つ以上のインターフェイスに非内部 IP があるかどうかを確認することでした。

それが本当なら、私はexec()を使用して、明確に定義されたサーバー (私は Google の DNS サーバーが好きです) で ping を開始しました。exec() の戻り値を確認することで、ping が成功したかどうかがわかります。インターフェイスの種類に基づいて ping の数を調整しました。プロセスをフォークするとオーバーヘッドが発生しますが、このテストは私のアプリではあまり頻繁に実行されないため、余裕があります。また、ping と IP アドレスを使用することで、構成されている DNS に依存しません。次に例を示します。

var exec = require('child_process').exec, child;
child = exec('ping -c 1 128.39.36.96', function(error, stdout, stderr){
     if(error !== null)
          console.log("Not available")
      else
          console.log("Available")
});
于 2013-03-07T13:13:29.583 に答える
3

ここで他のソリューションでDNSキャッシュが気になったので、実際にhttp2を使って接続テストをしてみました。大量のデータを送信せず、DNS 解決のみに依存せず、非常に高速であるため、これがインターネット接続をテストする最良の方法だと思います。

これはv8.4.0 で追加されたことに注意してください。

const http2 = require('http2');

function isConnected() {
  return new Promise((resolve) => {
    const client = http2.connect('https://www.google.com');
    client.on('connect', () => {
      resolve(true);
      client.destroy();
    });
    client.on('error', () => {
      resolve(false);
      client.destroy();
    });
  });
};

isConnected().then(console.log);

編集:誰かが興味を持っている場合は、これをパッケージにしました。

于 2020-03-28T15:28:43.217 に答える