Node.js中的网络状态更改事件?

时间:2019-01-05 19:46:06

标签: javascript node.js network-programming

我发现的所有解决方案都只是轮询服务。例如。他们每秒对google.com进行一次ping操作,以查看Node服务是否可以访问Internet。

但是,我正在寻找一种更清洁的基于事件的解决方案。在浏览器中,有window.ononlinewindow.onoffline。我知道这些并不完美,但总比没有好。

我不一定要寻找一种方法来查看Node服务是否在线,我只是想寻找一种方法来查看OS是否认为其在线。例如。如果操作系统未连接到任何网络接口,则肯定处于脱机状态。但是,如果连接到路由器,则可以ping google.com

3 个答案:

答案 0 :(得分:1)

我相信目前,这是判断您是否已连接的最有效方法。

如果您想要一个“基于事件”的解决方案,则可以使用以下方式包装轮询服务:

connectivity-checker.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 };

然后在您使用的网站(例如app.js

app.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();

希望这对您有帮助...

答案 1 :(得分:1)

您的假设部分正确。从操作系统级别,您可以检测您是否已连接到网络,但这不能保证您可以访问互联网。另外,本地检查我是否具有网络连接对于不同的操作系统将有所不同。

因此,了解您是否具有Internet连接性的最可靠方法是尝试从Internet访问任何资源,然后查看您是否成功。由于某些原因,该资源可能不可访问,因此您的策略应该是访问多个知名资源,并查看是否可以访问其中的任何一个。

为此,我使用了is-online npm软件包。它依靠访问Internet资源和DNS解析来检查您是否连接到Internet。

示例代码:

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

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

答案 2 :(得分:0)

**更新

我认为该模块可以满足您的需求,它具有使用网络接口的许多有用方法。

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

基本示例:告诉您是否连接到网关,并返回其IP。

*(我在机器上测试过)

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