5
votes

Événements de changement d'état du réseau dans Node.js?

Toutes les solutions que j'ai trouvées interrogent simplement un service. Par exemple. ils envoient un ping à google.com toutes les secondes pour voir si le service Node a accès à Internet.

Cependant, je recherche une solution plus propre basée sur les événements. Dans le navigateur, il y a window.ononline et window.onoffline . Je sais que ce ne sont pas parfaits, mais ils valent toujours mieux que rien.

Je ne cherche pas nécessairement un moyen de voir si un service Node est en ligne, je cherche simplement un moyen de voir si le système d'exploitation pense qu'il est en ligne. Par exemple. si le système d'exploitation n'est connecté à aucune interface réseau, il est définitivement hors ligne. Cependant, s'il est connecté à un routeur, je peux peut-être envoyer une requête ping à google.com .


2 commentaires

Il n'y a rien que vous puissiez faire sans une boucle, nodeJs est basé sur des événements et il a une boucle. alors peut-être simplement faire une boucle sur le ping DNS au lieu de Google pour voir que vous êtes connecté à un réseau, ou compter sur un autre service auquel vous parlez via une prise qui vous dira lorsque vous n'êtes pas connecté à Internet ou à un réseau spécifique ( probablement une solution matérielle câblée à votre machine d'exécution nodeJs)


Vérifiez ce lien, cela pourrait aider stackoverflow.com / questions / 15270902 /…


3 Réponses :


0
votes

** MISE À JOUR

Je pense que ce module a ce que vous recherchez, il dispose de nombreuses méthodes utiles pour travailler avec les interfaces réseau.

https://www.npmjs.com/package/network

Exemple de base: vous indique si vous êtes connecté à un passerelle ou non, et renvoie son IP.

* (j'ai testé sur ma machine)

var network = require("network");

network.get_gateway_ip(function(err, ip) {
  if (err) {
    console.log("No Gateway IP found!");
  } else {
    console.log(`Gateway IP: ${ip}`);
  }
});


1 commentaires

1
votes

Je pense qu'actuellement, c'est le moyen le plus efficace de savoir si vous êtes connecté.

Si vous souhaitez avoir une solution "basée sur les événements", vous pouvez envelopper le service de sondage avec quelque chose comme ceci:

connectivity-checker.js

const { ConnectivityChecker } = require("/path/to/connectivity-checker.js");

const checker = new ConnectivityChecker(function(isOnline) {
    // Will be called ONLY IF isOnline changes from 'false' to 'true' or from 'true' to 'false'.
    // Will be not called anytime isOnline status remains the same from between each check
    // This simulates the event-based nature you're looking for


    if (isOnline) {
        // Do stuff if online
    } else  {
        // Do stuff if offline
    }
}, 5000);

// Where your app starts, call
checker.init();

// Where your app ends, call
// checker.cleanUp();

Puis dans votre site d'utilisation (par exemple app.js code>)

app.js

const isOnline = require("is-online");

function ConnectivityChecker (callback, interval) {
    this.status = false;
    this.callback = callback;
    this.interval = this.interval;
    // Determines if the check should check on the next interval
    this.shouldCheckOnNextInterval = true;
}

ConnectivityChecker.prototype.init = function () {
    this.cleanUp();

    this.timer = setInterval(function () {
        if (this.shouldCheck) {
            isOnline().then(function (status) {
                if (this.status !== status) {
                    this.status = status;
                    this.callback(status);
                    this.shouldCheckOnNextInterval = true;
                }
            }).catch(err => {
                console.error(err);
                this.shouldCheckOnNextInterval = true;
            })

            // Disable 'shouldCheckOnNextInterval' if current check has not resolved within the interval time
            this.shouldCheckOnNextInterval = false;
        }
    }, this.interval);
}

ConnectivityChecker.prototype.cleanUp = function () {
    if (this.timer) clearInterval(this.timer);
}

export { ConnectivityChecker };

J'espère que cela vous aidera ...


0 commentaires

1
votes

Votre hypothèse est en partie correcte. À partir du niveau du système d'exploitation, vous pouvez détecter si vous êtes connecté à un réseau ou non, mais cela ne garantit pas que vous avez accès à Internet. De plus, vérifier nativement si je dispose d'une connectivité réseau va être différent pour différents systèmes d'exploitation.

Le moyen le plus fiable de savoir si vous avez une connectivité Internet est d'essayer d'accéder à n'importe quelle ressource depuis Internet et de voir si vous réussissez . La ressource peut ne pas être accessible pour certaines raisons, donc votre stratégie devrait accéder à plusieurs ressources bien connues et voir si vous pouvez accéder à l'une d'entre elles.

Pour cela, j'ai utilisé le est en ligne npm package. Il repose sur l'accès aux ressources Internet et à la résolution DNS pour vérifier si vous êtes connecté à Internet.

Exemple de code:

const isOnline = require('is-online');

isOnline().then(online => {
  if(online){
     console.log("Connected to internet");
  }else{
     console.log("Not connected to internet");
  }
 });


0 commentaires