2013-03-07 150 views

回答

26

一個快速和骯髒的方法是檢查是否節點可以解決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以區分'無法解析'和'無法連接到名稱服務器,因此連接可能會關閉')。

+1

解決方案取決於谷歌。有沒有其他的東西,像標準的方式? – Deep 2017-02-23 06:54:47

+1

@Deep如果你有自己的網站,試着解決它,而不是谷歌。否則,像谷歌這樣的高可用性服務器是您的最佳選擇https://github.com/sindresorhus/is-online是一個選項 – Ero 2017-02-24 20:38:30

+0

看來,這緩存了結果,所以如果您的應用程序在運行此代碼後失去連接,它會給出錯誤的印象,即存在連接。 – BrunoLM 2017-05-11 16:15:40

7

我不得不在前段時間在NodeJS-app中構建類似的東西。我這樣做的方式是首先使用networkInterfaces()函數是OS模塊,然後檢查一個或多個接口是否具有非內部IP。

如果這是真的,那麼我使用exec()開始ping定義良好的服務器(我喜歡Google的DNS服務器)。通過檢查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") 
}); 
33

儘管robertklep的解決方案的工作原理,它遠遠不是最好的選擇。如果您沒有互聯網連接,dns.resolve需要大約3分鐘時間,如果您沒有互聯網連接,則會發出錯誤,而dns.lookup幾乎立即響應,並顯示錯誤ENOTFOUND

所以我做了這個功能:

function checkInternet(cb) { 
    require('dns').lookup('google.com',function(err) { 
     if (err && err.code == "ENOTFOUND") { 
      cb(false); 
     } else { 
      cb(true); 
     } 
    }) 
} 

// example usage: 
checkInternet(function(isConnected) { 
    if (isConnected) { 
     // connected to the internet 
    } else { 
     // not connected to the internet 
    } 
}); 

這是目前爲止檢查互聯網連接的最快方式,它避免了不相關的互聯網連接的所有錯誤。

+1

解決方案取決於谷歌。有沒有其他的東西,像標準的方式? – Deep 2017-02-23 06:55:01

+3

Deep Kakkar你需要研究互聯網如何工作。有人已經告訴過你了,但是這裏又一次(逐字):沒有這樣的「標準」方式,因爲爲了測試**互聯網**的連通性,你必須在互聯網**上測試一些實際的東西。 如果您不喜歡針對Google進行測試,請針對Facebook,雅虎,華爾街日報或任何其他網站進行測試。但是你必須在**實際的互聯網**上使用一個網站。沒有其他辦法。 – 2017-08-03 15:35:06

4

這不是儘可能做到萬無一失,但完成這項工作:

var dns = require('dns'); 
dns.lookupService('8.8.8.8', 53, function(err, hostname, service){ 
    console.log(hostname, service); 
    // google-public-dns-a.google.com domain 
}); 

只使用一個簡單if(err)和充分治療的反應。 :)

ps .:請不要打擾告訴我8.8.8.8不是一個需要解決的名稱,它只是從谷歌查找高度可用的dns服務器。目的是檢查連通性,而不是名稱解析。

+0

解決方案取決於谷歌。有沒有其他的東西,像標準的方式? – Deep 2017-02-23 06:54:58

+3

真的沒有這樣的「標準」方式,因爲要測試**互聯網**連接性,您必須在**互聯網**上實際測試某些內容。我想你可以檢查你想要的任何東西,亞馬遜,isp,cdn,IDK,爲了簡單起見,只是使用谷歌,BTW使用IP使它獨立於DNS。 – 2017-03-05 10:30:39