我发现的所有解决方案都只是轮询服务。例如。他们每秒对google.com
进行一次ping操作,以查看Node服务是否可以访问Internet。
但是,我正在寻找一种更清洁的基于事件的解决方案。在浏览器中,有window.ononline
和window.onoffline
。我知道这些并不完美,但总比没有好。
我不一定要寻找一种方法来查看Node服务是否在线,我只是想寻找一种方法来查看OS是否认为其在线。例如。如果操作系统未连接到任何网络接口,则肯定处于脱机状态。但是,如果连接到路由器,则可以ping google.com
。
答案 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}`);
}
});