2013-03-07 128 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