Nodejs обнаруживает, если Интернет отключен

Node.js HTML
  • суг команда
  • Автор: Tomey.

задний план

Недавно я разрабатываю приложение с Electron, в котором необходимо определить, отключен ли Интернет. Electron основан на Chromium и Node.js, что позволяет создавать приложения с использованием HTML, CSS и JavaScript. Поэтому Electron предоставляет nodejs и браузер в двух операционных средах.

Первым решением, которое я рассмотрел, было событие подключения к сети онлайн/офлайн, предоставляемое HTML5.

window.addEventListener('online', ...)
window.addEventListener('offline', ...)

Вывод очень разочаровывает, что эти два события сетевого подключения просто определяют состояние подключения к локальной сети.

Поскольку Internet Explorer не предоставляет интерфейс тестирования, отключен, вы можете найти только ответ в Nodejs.

исследование

Когда дело доходит до nodejs, первое, о чем я думаю, это пойти в репозиторий npm для поиска существующих библиотек. Найдены две библиотеки для определения состояния интернетаinternet-available,is-online

internet-available

Эта библиотека определяет принцип статуса подключения к Интернету, который заключается в определении статуса подключения DNS.

Здесь должен возникнуть вопрос, не проще ли использовать собственный модуль dns для nodejs?

Вы правы, nodejs предоставляет такой метод, но собственный модуль dns не обеспечивает обнаружение тайм-аута. в доступном интернету можно установить параметр тайм-аута, по умолчанию 5000мс (полагаясь на библиотеку dns-socket для достижения тайм-аута dns, если вам интересно, вы можете изучить его исходный код, который не будет здесь расширяться).

пример использования в Интернете:

var internetAvailable = require("internet-available");

internetAvailable().then(function(){
    console.log("Internet available");
}).catch(function(){
    console.log("No internet");
});

Если вы хотите добавить количество обнаружений и время ожидания каждого обнаружения, код выглядит следующим образом:

var internetAvailable = require("internet-available");

internetAvailable({
    timeout: 4000,
    retries: 10,
}).then(function(){
    console.log("Internet available");
}).catch(function(){
    console.log("No internet");
});

DNS-имя домена по умолчанию, обнаруженное в Интернете, — google.com. Если вы хотите настроить доменное имя, код выглядит следующим образом:

var internetAvailable = require("internet-available");

internetAvailable({
    domainName: "xxxxx.com",
    port: 53,
    host: '8.8.8.8' // 默认,国内请改成114.114.114.114
}).then(() => {
    console.log("Internet available");
}).catch(() => {
    console.log("No internet");
});

Примечания: 8.8.8.8 — это бесплатный DNS-сервер, предоставляемый Google.Этот адрес является универсальным.Условно говоря, он больше подходит для иностранных пользователей и пользователей, посещающих иностранные веб-сайты.114.114.114.114 больше подходит для домашнего использования.

is-online

is-online определяется так же, как и доступность в Интернете, с той лишь разницей, что is-online может работать как в среде nodejs, так и в среде браузера. В среде браузера статус сетевого подключения возвращается через navigator.onLine, но, как и онлайн- и офлайн-события HTML5, могут быть обнаружены только локальные подключения.

пример использования is-online

const isOnline = require('is-online');
 
isOnline().then(online => {
    if(online){
        console.log("We have internet");
    }else{
        console.log("Houston we have a problem");
    }
});

Эта библиотека также предоставляет настройки тайм-аута и может устанавливать версию интернет-протокола — расширенный параметр, который обычно не нужно устанавливать, но он очень полезен для конкретной проверки подключения IPv6. Код выглядит следующим образом:

var isOnline = require('is-online');
 
isOnline({
    timeout: 5000,
    version: "v4" // v4 or v6
}).then(online => {
    if(online){
        console.log("Internet available");
    }else{
        console.log("No internet");
    }
});

Суммировать

Помимо этих двух библиотек есть еще способы обнаружить его вне интернета? Автор также может в настоящее время предусмотреть, инициировав заголовок HTTP, определяет, был ли ответ на запрос успешным, пинг оценивается путем определения того, является ли целевой хост или домен связи. Если есть способ лучше, добро пожаловать в обсуждение -

Категории