检查NodeJs中的互联网连接

在Raspberry Pi上安装NodeJS,有没有办法检查rPi是否通过NodeJ连接到互联网?

快速而肮脏的方法是检查Node是否可以parsingwww.google.com

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

这不是完全万无一失,因为你的RaspPi可以连接到互联网,但由于某种原因无法parsingwww.google.com ,你也可能想检查err.type来区分'无法解决'和'不能连接到名称服务器,以便连接可能closures“)。

虽然robertklep的解决scheme的作品,它远远不是这个最好的select。 如果没有互联网连接, dns.resolve会花费大约3分钟的时间,如果没有互联网连接, dns.lookup出现错误,而dns.lookup几乎可以立即响应ENOTFOUND错误。

所以我做了这个function:

 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 } }); 

这是检查互联网连接的最快方式,它避免了所有与互联网连接无关的错误。

前段时间,我不得不在NodeJS-app中构build类似的东西。 我做的方式是首先使用networkInterfaces()函数是OS模块,然后检查一个或多个接口是否具有非内部IP。

如果这是真的,那么我用exec()来启动一个定义良好的服务器(我喜欢谷歌的DNS服务器)的ping。 通过检查exec()的返回值,我知道ping是否成功。 我根据接口types调整了ping的数量。 分叉进程引入了一些开销,但是由于这个testing在我的应用程序中执行得不是很频繁,所以我能负担得起。 此外,通过使用ping和IP地址,你不依赖于DNSconfiguration。 这里是一个例子:

 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") }); 

这不是尽可能的万无一失,但完成工作:

 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服务器查找。 目的是检查连通性,而不是名称parsing。