检查NodeJ中的Internet连接

问题描述 投票:28回答:6

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

node.js networking raspberry-pi
6个回答
31
投票

一种快速而肮脏的方法是检查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以区分“无法解析”和“无法连接到名称服务器”这样连接可能已关闭')。


39
投票

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

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


8
投票

我不得不在不久前在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")
});

6
投票

尽管不是万无一失,但要完成工作:

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


2
投票

我发现了一个非常简单的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);
    });

0
投票

自2019年起,您可以使用DNS promises lookup

注意此API是实验性的。

const dns = require('dns').promises;

exports.checkInternet = function checkInternet() {
    return dns.lookup('google.com')
        .then(() => true)
        .catch(() => false);
};
© www.soinside.com 2019 - 2024. All rights reserved.