Compruebe la conectividad a Internet en NodeJS


Instalado NodeJS en Raspberry Pi, ¿hay alguna forma de comprobar si el rPi está conectado a Internet a través de NodeJS ?

Author: Donald Derek, 2013-03-07

4 answers

Una forma rápida y sucia es comprobar si el nodo puede resolver www.google.com:

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

Esto no es completamente infalible, ya que su RaspPi puede estar conectado a Internet pero no puede resolver www.google.com por alguna razón, y también puede que desee comprobar err.type para distinguir entre 'no se puede resolver' y 'no se puede conectar a un servidor de nombres por lo que la conexión podría estar inactiva').

 27
Author: robertklep,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-17 20:50:04

Si bien la solución de robertklep funciona, está lejos de ser la mejor opción para esto. dns.resolve tarda unos 3 minutos en perder el tiempo y dar un error si no tiene una conexión a Internet, mientras que dns.lookup responde casi instantáneamente con el error ENOTFOUND.

Así que hice esta función:

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

Esta es, con mucho, la forma más rápida de verificar la conectividad a Internet y evita todos los errores que no están relacionados con la conectividad a Internet.

 34
Author: Jaruba,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-25 11:46:58

Tuve que construir algo similar en una aplicación NodeJS hace algún tiempo. La forma en que lo hice fue usar primero la función networkInterfaces() es el módulo OS y luego verificar si una o más interfaces tienen una IP no interna.

Si eso era cierto, entonces usé exec() para iniciar ping con un servidor bien definido (me gustan los servidores DNS de Google). Comprobando el valor devuelto de exec (), sé si ping fue exitoso o no. Ajusté el número de pings según el tipo de interfaz. Bifurcar un proceso introduce cierta sobrecarga, pero como esta prueba no se realiza con demasiada frecuencia en mi aplicación, puedo permitírmelo. Además, al usar ping y direcciones IP, no depende de que se configure DNS. He aquí un ejemplo:

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")
});
 7
Author: Kristian Evensen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-07 13:13:29

No es tan infalible como sea posible, pero hacer el trabajo:

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

Simplemente use un if(err) simple y trate la respuesta adecuadamente. :)

Ps.: Por favor, no te molestes en decirme que 8.8.8.8 no es un nombre por resolver, es solo una búsqueda de un servidor dns altamente disponible de Google. La intención es comprobar la conectividad, no la resolución del nombre.

 5
Author: Caio Wilson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-26 13:56:27