NodeJS installé sur Raspberry Pi, existe-t-il un moyen de vérifier si le rPi est connecté à Internet via NodeJs?
Un moyen rapide et sale est de vérifier si Node peut résoudre 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 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 err.type
pour faire la distinction entre "impossible à résoudre" et "ne peut pas se connecter à un serveur de noms afin que la connexion soit interrompue").
Si la solution de robertklep fonctionne, elle est loin d'être le meilleur choix pour cela. Cela prend environ 3 minutes pour dns.resolve
pour expirer et donner une erreur si vous n'avez pas de connexion Internet, tandis que dns.lookup
répond presque instantanément avec l'erreur ENOTFOUND
.
J'ai donc fait 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 il évite toutes les erreurs qui ne sont pas liées à la connectivité Internet.
J'ai dû construire quelque chose de similaire dans une application NodeJS il y a quelque temps. La façon dont je l'ai fait était d'utiliser d'abord la fonction networkInterfaces () est le module OS, puis de vérifier si une ou plusieurs interfaces ont une IP non interne.
Si c'était vrai, 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. Le fait de bifurquer un processus introduit une surcharge, mais comme ce test n'est pas effectué trop fréquemment dans mon application, je peux me le permettre. De plus, en utilisant le 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 une simple if(err)
et traitez la réponse de manière adéquate. :)
ps.: Ne vous embêtez pas à me dire que le 8.8.8.8 n'est pas un nom à résoudre, c'est juste une recherche d'un serveur DNS hautement disponible de google. L'intention est de vérifier la connectivité, pas la résolution de noms.
J'ai trouvé un outil npm génial et simple pour détecter la connexion Internet. Il semble plus fiable.
Vous devez d'abord installer npm i check-internet-connected
Ensuite, vous pouvez l'appeler comme suit
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);
});
À partir de 2019, vous pouvez utiliser recherche de promesses DNS .
[~ # ~] note [~ # ~] Cette API est expérimentale.
const dns = require('dns').promises;
exports.checkInternet = function checkInternet() {
return dns.lookup('google.com')
.then(() => true)
.catch(() => false);
};
Il est très utile de vérifier si la connexion Internet de notre navigateur est disponible ou non.
var internetAvailable = require("internet-available");
internetAvailable().then(function(){
console.log("Internet available",internetAvailable);
}).catch(function(){
console.log("No internet");
});
pour plus [disponible sur Internet] [1]: https://www.npmjs.com/package/internet-available