Javascript:检查服务器是否联机?

btxsgosb  于 2023-01-29  发布在  Java
关注(0)|答案(7)|浏览(98)

通过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;
    }   
}

问题是,如果服务器离线,它就不会返回。我如何设置一个超时,这样如果它在一定时间后没有返回,我就可以认为它离线了?

j2cgzkjk

j2cgzkjk1#

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 load解决方案是最简单的。没有必要为超时而烦恼。如果你想让代码看起来像是同步的,这里有一些语法糖给你:

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

iszxjhcz2#

下面是我如何在Node.js应用程序中使用Fetch管理请求并使用AbortController处理超时来检查服务器可用性的。

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

kxxlusnw3#

添加到gilly3答案
在实践中,我发现需要使用document.body.appendChild相当慢
虽然问题是关于纯JavaScript的,但使用一些HTML会使解决方案更快。
所以我把这段代码留给那些追求速度的人。

<html>
<head>
    <title>Some page</title>
</head>

<body>
  <img src="https://myserver.com/ping.gif"  onload="pageOnline()" onerror="pageOffline()">

  <script>

  function pageOnline() {
    // Online code
  }

  function pageOffline() {
    // Offline code
  }
</script>
</body>
</html>
cyvaqqii

cyvaqqii4#

使用一个XMLHttpRequest,然后检查它是否失败。虽然不确定这是否可以跨域工作。

lnxxn5zx

lnxxn5zx5#

调用一个 AJAX ,它的结果会告诉你。

arknldoa

arknldoa6#

最初的答案仍然有效,但已经过时了。下面是我采取的方法:

import axios from 'axios'
import to from 'await-to-js'

export default async function pingAppReady(healthCheckPath: string, recursive = true) {
  return new Promise<void>(async (resolve, reject) => {
    // Ping the path e.g http://localhost:3000
    const [err] = await to(axios.get(healthCheckPath))

    // resolve if the ping returns no error or error that is not related to the connection
    if (!err) return resolve()
    if (err.code !== 'ECONNREFUSED') return resolve()

    if (!recursive) reject()

    setTimeout(async () => {
      await pingAppReady(healthCheckPath, recursive)
      resolve()
    }, 5000)
  })
}
1zmg4dgp

1zmg4dgp7#

由于XMLHttpRequest对我来说不适用于cors问题,我找到并尝试了gilly3的答案,如果你调用一次,它会工作得很好。当你频繁检查服务器时,它会失败,因为加载的图形文件已经在浏览器该高速缓存中了。所以我添加了一个随机元素作为查询字符串来避免这种情况。(一个解决方案,我也在堆栈溢出的某个地方找到了。)

function checkServer(callback, fqdn, imagepath="/favicon.ico") {
    let img = new Image();
    img.onload = function() { callback(fqdn, true); };
    img.onerror = function() { callback(fqdn, false); };
    img.src = "http://" + fqdn + imagepath + '?r=' + Math.random(); /* avoids caching */
}

相关问题