Check for internet connectivity in NodeJs

2020-02-02 11:12发布

Installed NodeJS on Raspberry Pi, is there a way to check if the rPi is connected to the internet via NodeJs ?

7条回答
家丑人穷心不美
2楼-- · 2020-02-02 11:32

A quick and dirty way is to check if Node can resolve www.google.com:

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

This isn't entire foolproof, since your RaspPi can be connected to the Internet yet unable to resolve www.google.com for some reason, and you might also want to check err.type to distinguish between 'unable to resolve' and 'cannot connect to a nameserver so the connection might be down').

查看更多
虎瘦雄心在
3楼-- · 2020-02-02 11:33

As of 2019 you can use DNS promises lookup.

NOTE This API is experimental.

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

exports.checkInternet = function checkInternet() {
    return dns.lookup('google.com')
        .then(() => true)
        .catch(() => false);
};
查看更多
等我变得足够好
4楼-- · 2020-02-02 11:33

It is very helpful to check internet connection for our browser is available or not.

var internetAvailable = require("internet-available");

internetAvailable().then(function(){
    console.log("Internet available",internetAvailable);
}).catch(function(){
    console.log("No internet");
});

for more[internet-available][1]: https://www.npmjs.com/package/internet-available

查看更多
爷、活的狠高调
5楼-- · 2020-02-02 11:34

I had to build something similar in a NodeJS-app some time ago. The way I did it was to first use the networkInterfaces() function is the OS-module and then check if one or more interfaces have a non-internal IP.

If that was true, then I used exec() to start ping with a well-defined server (I like Google's DNS servers). By checking the return value of exec(), I know if ping was sucessful or not. I adjusted the number of pings based on the interface type. Forking a process introduces some overhead, but since this test is not performed too frequently in my app, I can afford it. Also, by using ping and IP-adresses, you dont depend on DNS being configured. Here is an example:

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楼-- · 2020-02-02 11:44

It's not as foolproof as possible but get the job done:

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

just use a simple if(err) and treat the response adequately. :)

ps.: Please don't bother telling me 8.8.8.8 is not a name to be resolved, it's just a lookup for a highly available dns server from google. The intention is to check connectivity, not name resolution.

查看更多
放我归山
7楼-- · 2020-02-02 11:44

I found a great and simple npm tool to detect internet connection. It's looks like more reliable.

First you need to install npm i check-internet-connected

Then you can call it like follows

  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);
    });
查看更多
登录 后发表回答