Vérifier la connectivité Internet dans NodeJs

NodeJS installé sur Raspberry Pi, existe-t-il un moyen de vérifier si le rPi est connecté à Internet via NodeJs?

Une méthode rapide et délicate consiste à vérifier si Node peut résoudre le problème de www.google.com :

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

Ce n’est pas tout à fait infaillible, car votre RaspPi peut être connecté à Internet mais ne peut pas résoudre www.google.com pour une raison quelconque, et vous pouvez également vérifier le err.type de document err.type pour distinguer les err.type «impossible à résoudre» et «impossible». connectez-vous à un serveur de noms afin que la connexion soit interrompue ‘).

Bien que la solution de robertklep fonctionne, elle est loin d’être le meilleur choix pour cela. Cela prend environ 3 minutes pour que dns.resolve le délai d’expiration et donne une erreur 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); } }) } // example usage: checkInternet(function(isConnected) { if (isConnected) { // connected to the internet } else { // not connected to the internet } }); 

C’est de loin le moyen le plus rapide de vérifier la connectivité Internet et évite toutes les erreurs qui ne sont pas liées à la connectivité Internet.

Je devais construire quelque chose de similaire dans une application NodeJS il y a quelque temps. Pour ce faire, j’ai d’abord utilisé la fonction networkInterfaces (): utilisez le module OS, puis vérifiez si une ou plusieurs interfaces ont une adresse IP non interne.

Si cela était vrai, alors j’ai utilisé exec () pour démarrer le ping avec un serveur bien défini (j’aime les serveurs DNS de Google). En vérifiant la valeur de retour de exec (), je sais si le ping a réussi ou non. J’ai ajusté le nombre de pings en fonction du type d’interface. La création d’un processus introduit des frais généraux, mais comme ce test n’est pas effectué trop souvent dans mon application, je peux me le permettre. De plus, en utilisant ping et les adresses IP, vous ne dépendez pas de la configuration du DNS. Voici un exemple:

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

Ce n’est pas aussi infaillible que possible mais faites le travail:

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

utilisez simplement un simple if(err) et traitez correctement la réponse. 🙂

ps .: S’il vous plaît, ne vous inquiétez pas de me dire que 8.8.8.8 n’est pas un nom à résoudre, c’est juste une recherche d’un serveur DNS haute disponibilité de Google. L’intention est de vérifier la connectivité, pas la résolution de nom.