Подтвердить что ты не робот

Проверьте подключение к Интернету в NodeJs

Установленный NodeJS на Raspberry Pi, есть ли способ проверить, подключен ли rPi к Интернету через NodeJs?

4b9b3361

Ответ 1

Быстрый и грязный способ проверить, может ли Node разрешить www.google.com:

require('dns').resolve('www.google.com', function(err) {
  if (err) {
     console.log("No connection");
  } else {
     console.log("Connected");
  }
});

Это не полная защита, так как ваш RaspPi может быть подключен к Интернету, но по какой-то причине не смог разрешить www.google.com, и вы также можете проверить err.type на то, чтобы отличать "неспособность к разрешению" и "невозможно", не может подключиться к серверу имен, чтобы соединение могло быть отключено ").

Ответ 2

В то время как решение robertklep работает, это далеко не лучший выбор для этого. Для dns.resolve для таймаута требуется около 3 минут и давать сообщение об ошибке, если у вас нет подключения к Интернету, а dns.lookup почти мгновенно отвечает с ошибкой ENOTFOUND.

Итак, я сделал эту функцию:

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

Это, безусловно, самый быстрый способ проверить подключение к Интернету, и он избегает всех ошибок, которые не связаны с подключением к Интернету.

Ответ 3

Мне нужно было создать нечто похожее в NodeJS-приложении некоторое время назад. То, как я это делал, это сначала использовать функцию networkInterfaces() - это OS-модуль, а затем проверить, нет ли одного или нескольких интерфейсов, внутренний IP.

Если это правда, то я использовал exec() для запуска пинга с хорошо определенным сервером (мне нравятся DNS-серверы Google). Проверяя возвращаемое значение exec(), я знаю, что ping был успешным или нет. Я скорректировал количество пингов на основе типа интерфейса. Викинг процесса вызывает некоторые накладные расходы, но поскольку этот тест не выполняется слишком часто в моем приложении, я могу себе это позволить. Кроме того, используя ping и IP-адреса, вы не будете зависеть от настроенного DNS. Вот пример:

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

Ответ 4

Это не настолько надежное, насколько возможно, но выполнить работу:

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

просто используйте простой if(err) и относитесь к ответу адекватно.:)

ps.: Пожалуйста, не беспокойтесь, говоря, что 8.8.8.8 - это не имя, которое нужно разрешить, это просто поиск высокодоступного сервера DNS из Google. Целью является проверка возможности подключения, а не разрешение имен.

Ответ 5

Я нашел отличный и простой инструмент npm для обнаружения интернет-соединения. Похоже, надежнее.

Сначала нужно установить npm я check-internet-connected

Тогда вы можете назвать это следующим образом

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

Ответ 6

Начиная с 2019 года вы можете использовать поиск DNS-обещаний.

ПРИМЕЧАНИЕ. Этот API является экспериментальным.

const dns = require('dns').promises;

exports.checkInternet = function checkInternet() {
    return dns.lookup('google.com')
        .then(() => true)
        .catch(() => false);
};

Ответ 7

Очень полезно проверить доступность интернет-соединения для нашего браузера или нет.

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

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

для получения дополнительной информации [доступно через Интернет] [1]: https://www.npmjs.com/package/internet-available