JS Servercheck Erreichbarkeit mit Umleitung

IvOOry

Grünschnabel
Hi Leute, ich habe ein kleines Javascript, was die Erreichbarkeit eines Webservers überprüfen soll und dann dahin umleiten soll. Für einige Server gibt es einen Mirror (wenn der erste nicht erreichbar ist) wohin dann umgeleitet werden soll. Überprüft wird dies indem ein Bild was auf jedem Webspace liegt (lokale Server im Heimnetz) versucht wird aufzurufen wenn möglich = server erreichbar = dahin umleiten.

Leider funktioniert das Script nicht (vermutlich ein grober Typo) aber ich finde einfach den Fehler nicht und hoffe, ihr könnt mit mit eurem paar Augen weiterhelfen. =)

Der Aufruf erfolgt über einen Link der bspw so aussieht: "/check.html?=server1"

Java:
<html>
 <head>
</head>
<body>
  <span id="status">Teste Server erreichbarkeit ...</span>

<script>

function getURLParameter(name) {
    var value = decodeURIComponent((RegExp(name + '=' + '(.+?)(&|$)').exec(location.search) || [, ""])[1]);
    return (value !== 'null') ? value : false;
}

const SERVERS = {
    'server1': ['192.168.1.1', '192.168.1.11'], // hat einen Mirror  auf der .11
    'server2': ['192.168.1.2'], // nur ein server ohne mirror
    'server3': ['192.168.1.3'], // nur ein server ohne mirror
    'server4': ['192.168.1.4', '192.168.1.14'], // hat einen Mirror  auf der .14
}

function checker(name, index) {
  // Check if input is valid
  if (!SERVERS.hasOwnProperty(name)) {
    console.error('Server "${NAME}" is not valid');
  }
  if (index >= SERVERS[name].length) {
    console.error('Invalid server index');
  }
 
    // Create (non-visible) image for reachable check
    let image = new Image();
 
    // Success handler which redirects to the ip
    image.onload = () => {
        window.location.replace('http://${SERVERS[name][index]}');
    }

    // Failed handler which calls the check method again if we have servers to check, otherwise display error message
    image.onerror = () => {
        if (SERVERS[name].length > index + 1) {
            checker(name, index + 1);
        } else {
            document.getElementById('status').innerHTML = 'Der Server "${name}" ist leider nicht erreichbar!';
        }
    }
 
  img.src = 'http://${SERVER[name][index]}/logo.gif';
}

checker(getURLParameter('srv'), 0);

</script>
</body>

</html>

Gruß
Iv0ry
 
img.src = 'http://${SERVER[name][index]}/logo.gif';
Du benötigst Backticks (`), damit ${...} vom JS Interpreter wirklich in den String interpoliert wird.

Beachte, dass diese Syntax auch nicht von allen Browsern unterstützt wird: https://developer.mozilla.org/de/do...erence/template_strings#Browserkompatibilität. Der größte Anteil davon wird wohl IE sein; von Edge wird es jedoch unterstützt! Eventuell musst du in deinem Build dann runterkompilieren auf ES 5.
 
Stimmt, so sollte es nun eigentlich funktionieren, macht es leider weiterhin nicht. Das Script wird nur im Firefox/Chrome aufgerufen und da sollte es keine Probleme geben.
Java:
<!DOCTYPE html>
<html>
 <head>
</head>
<body>
  <span id="status">Teste Server erreichbarkeit ...</span>

<script>

function getURLParameter(name) {
   var value = decodeURIComponent((RegExp(name + '=' + '(.+?)(&|$)').exec(location.search) || [, ""])[1]);
   return (value !== 'null') ? value : false;
}

const SERVERS = {
   'server1': ['192.168.1.1', '192.168.1.11'], // hat einen Mirror  auf der .11
   'server2': ['192.168.1.2'], // nur ein server ohne mirror
   'server3': ['192.168.1.3'], // nur ein server ohne mirror
   'server4': ['192.168.1.4', '192.168.1.14'], // hat einen Mirror  auf der .14
}

function checker(name, index) {
  // Check if input is valid
  if (!SERVERS.hasOwnProperty(name)) {
   console.error(`Server "${NAME}" is not valid`);
  }
  if (index >= SERVERS[name].length) {
   console.error('Invalid server index');
  }
 
   // Create (non-visible) image for reachable check
   let image = new Image();
 
   // Success handler which redirects to the ip
   image.onload = () => {
       window.location.replace(`http://${SERVERS[name][index]}`);
   }

   // Failed handler which calls the check method again if we have servers to check, otherwise display error message
   image.onerror = () => {
       if (SERVERS[name].length > index + 1) {
           checker(name, index + 1);
       } else {
           document.getElementById('status').innerHTML = `Der Server "${name}" ist leider nicht erreichbar :(`;
       }
   }
 
  img.src = `http://${SERVER[name][index]}/logo.gif`;
}

checker(getURLParameter('srv'), 0);

</script>
</body>

</html>
 
Was genau funktioniert nicht? Kommt eine Exception? Passiert gar nichts?

Übrigens, wenn du eh nur Google Chrome und Firefox Kompatibilität benötigst, kannst du auch ein URL-Objekt erzeugen:
Javascript:
function getURLParameter() {
  // Possible URI: http://example.com/check.html?=server1
  // => Call get with the empty string
  return (new URL(document.location)).searchParams.get("");
}
alert(getURLParameter());
 
@abdellaui: exakt genauso wird es aufgerufen.
@ ComFreek

Es passiert gar nichts auf der Seite. Und mit " window.location.replace" reicht es eigentlich brauche (denke ich) kein URL-Objekt. Aber wie gesagt, ich bin Laie. :)

Die Fehlerconsole von FF sagt:

TypeError: SERVERS[name] is undefined check.html:26:1
checker check.html:26:1
<anonym>
 
Davor sollte laut deiner Codelogik eigentlich noch die Nachricht "Server ... is not valid" kommen. Tut sie das? Ruf mal getURLParameter separat auf, um den tatsächlichen Rückgabewert zu erfahren.
 

Neue Beiträge

Zurück