Comment vérifier si on est connecté à internet en NodeJs?

J’ai installé NodeJS sur Raspberry Pi, existe-t-il un moyen de vérifier si le Raspberry Pi est connecté à l’internet via NodeJs ?

Un moyen rapide et pratique est de vérifier si NodeJs peut résoudre www.google.com :

require('dns').resolve('www.google.com', function(err) {
  if (err) {
     console.log("Pas de connexion");
  } else {
     console.log("Connecté");
  }
});

Ce n’est pas totalement sûr, puisque votre RaspPi peut être connecté à l’Internet mais incapable de résoudre www.google.com pour une raison quelconque, et vous pourriez aussi vérifier err.type pour faire la différence entre ‹ ne peut être résolue › et ‹ ne peut pas se connecter à un serveur de noms, la connexion peut donc être interrompue ›).

Bien que la solution de @Isaac fonctionne, elle est loin d’être le meilleur choix pour cela. Il faut environ 3 minutes à dns.resolve pour dépasser le temps imparti et donner une erreur (timeout) si vous n’avez pas de connexion internet, alors que dns.lookup répond presque instantanément avec l’erreur ENOTFOUND.

J’ai donc créé cette fonction :

function checkInternet(cb) {
    require('dns').lookup('google.com',function(err) {
        if (err && err.code == "ENOTFOUND") {
            cb(false);
        } else {
            cb(true);
        }
    })
}

// exemple d utilisation:
checkInternet(function(isConnected) {
    if (isConnected) {
        // connecté à l'internet
    } else {
        // n'est pas connecté à Internet
    }
});

C’est la méthode la plus rapide pour vérifier la connectivité à l’internet et elle évite toutes les erreurs qui ne sont pas liées à la connectivité à l’internet.

Ce n’est pas aussi sûr que possible, mais cela permet de faire le boulot :

var dns = require('dns');
dns.lookupService('8.8.8.8', 53, function(err, hostname, service){
  console.log(hostname, service);
    // ....
});

il suffit d’utiliser un simple if(err) et de traiter la réponse de manière adéquate :slight_smile:

ps. : Ne me dites pas que 8.8.8.8 n’est pas un nom à résoudre, c’est juste un serveur dns hautement disponible de google. L’objectif est de vérifier la connectivité, pas la résolution de noms.

Voici un exemple, dans une seule ligne : (Node 10.6+)

let cnx = !!await require('dns').promises.resolve('google.com').catch(()=>{});