在Raspberry Pi上安装了NodeJS,有没有办法检查rPi是否通过NodeJ连接到互联网?
一种快速而肮脏的方法是检查Node是否可以解析www.google.com
:
require('dns').resolve('www.google.com', function(err) {
if (err) {
console.log("No connection");
} else {
console.log("Connected");
}
});
这并非完全万无一失,因为您的RaspPi可以连接到Internet但由于某种原因无法解析www.google.com
,您可能还需要检查err.type
以区分“无法解析”和“无法连接到名称服务器”这样连接可能已关闭')。
虽然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
}
});
这是迄今为止检查互联网连接的最快方法,它避免了与互联网连接无关的所有错误。
我不得不在不久前在NodeJS-app中构建类似的东西。我这样做的方法是首先使用networkInterfaces()函数是OS模块,然后检查一个或多个接口是否具有非内部IP。
如果这是真的,那么我使用exec()开始ping一个定义明确的服务器(我喜欢谷歌的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")
});
尽管不是万无一失,但要完成工作:
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服务器。目的是检查连接性,而不是名称解析。
我发现了一个非常简单的npm工具来检测互联网连接。它看起来更可靠。
首先,您需要安装npm i check-internet-connected
然后你可以像下面这样调用它
const checkInternetConnected = require('check-internet-connected');
const config = {
timeout: 5000, //timeout connecting to each server(A and AAAA), each try (default 5000)
retries: 5,//number of retries to do before failing (default 5)
domain: 'google.com'//the domain to check DNS record of
}
checkInternetConnected(config)
.then(() => {
console.log("Internet available");
}).catch((error) => {
console.log("No internet", error);
});
自2019年起,您可以使用DNS promises lookup。
注意此API是实验性的。
const dns = require('dns').promises;
exports.checkInternet = function checkInternet() {
return dns.lookup('google.com')
.then(() => true)
.catch(() => false);
};