Установленный NodeJS на Raspberry Pi, есть ли способ проверить, подключен ли rPi к Интернету через NodeJs?
Проверьте подключение к Интернету в NodeJs
Ответ 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