Javascript: проверить, находится ли сервер в сети?
Какой самый быстрый способ проверить, подключен ли мой сервер через JavaScript?
Я пробовал следующий AJAX:
function isonline() {
var uri = 'MYURL'
var xhr = new XMLHttpRequest();
xhr.open("GET",uri,false);
xhr.send(null);
if(xhr.status == 200) {
//is online
return xhr.responseText;
}
else {
//is offline
return null;
}
}
Проблема в том, что он никогда не возвращается, если сервер отключен. Как установить таймаут, чтобы, если он не возвращается через определенное время, я могу предположить, что он отключен?
Ответы
Ответ 1
XMLHttpRequest
не работает в кросс-домене. Вместо этого я загрузил бы крошечный <img>
, который вы ожидаете быстро вернуться, и посмотрите событие onload
:
function checkServerStatus()
{
setServerStatus("unknown");
var img = document.body.appendChild(document.createElement("img"));
img.onload = function()
{
setServerStatus("online");
};
img.onerror = function()
{
setServerStatus("offline");
};
img.src = "http://myserver.com/ping.gif";
}
Изменить: Очистка моего ответа. Решение XMLHttpRequest
возможно в том же домене, но если вы просто хотите проверить, находится ли сервер в сети, решение загрузки img является самым простым. Там нет необходимости возиться с таймаутами. Если вы хотите, чтобы код выглядел как синхронный, вот вам какой-то синтаксический сахар:
function ifServerOnline(ifOnline, ifOffline)
{
var img = document.body.appendChild(document.createElement("img"));
img.onload = function()
{
ifOnline && ifOnline.constructor == Function && ifOnline();
};
img.onerror = function()
{
ifOffline && ifOffline.constructor == Function && ifOffline();
};
img.src = "http://myserver.com/ping.gif";
}
ifServerOnline(function()
{
// server online code here
},
function ()
{
// server offline code here
});
Ответ 2
Здесь, как я достиг проверки доступности сервера с помощью Fetch для управления запросом и AbortController для обработки тайм-аута в приложении Node.js.
function checkServer(url, timeout) {
const controller = new AbortController();
const signal = controller.signal;
const options = { mode: 'no-cors', signal };
return fetch(url, options)
.then(setTimeout(() => { controller.abort() }, timeout))
.then(response => console.log('Check server response:', response.statusText))
.catch(error => console.error('Check server error:', error.message));
}
Ответ 3
Используйте XMLHttpRequest
, а затем проверьте, не сработало ли оно. Не уверен, что это будет работать в разных доменах.
Ответ 4
Сделайте вызов ajax, и его результат покажет.
Ответ 5
Была такая же проблема, построено хакерское решение:
http://ruthere.co/ https://github.com/glennzw/ruthere
Пример:
var url = "https://stackoverflow.com";
var newImg = new Image;
newImg.src = "http://ruthere.co/u/" + url;
console.log("Checking " + url)
newImg.onload = function(){
console.log(this.width);
if (newImg.height == 200) {
console.log("Stackoverflow is up!");
} else {
console.log("Stackoverflow broke :(");
}
}