[ Impressum ]

LiveCode Server für HTTP-Server mit Node.js

www.Rozek.de > LiveCode Server > Node.js
Die offiziellen Anleitungen erklären nur, wie man "LiveCode Server" [1] als CGI-Prozessor für den Apache-Server installiert. Dabei kann man das Paket problemlos auch mit anderen Servern zusammen betreiben. Wer es beispielsweise leichtgewichtig mag, kann sich mit Node.js [2] und Express.js [3] unter Verwendung der SimpleCGI "Middleware" einen eigenen Server bauen, der CGI-Anforderungen an "LiveCode Server" weiterleitet.

Lesen Sie hier, wie Sie sich auf diese Weise Ihren eigenen Server zusammenstellen.

Übersicht

  • Ein einfacher Server für "LiveCode Server"
  • Server-Installation
  • Ein paar Test-Skripte

Ein einfacher Server für "LiveCode Server"

Wenn Sie mit "LiveCode Server" arbeiten möchten, sind Ihnen Begriffe wie "Node.js" und "Express.js" zwar u.U. nicht geläufig - damit einen CGI-fähigen Server aufzusetzen, ist dennoch recht einfach.

Vorab als Information: mit "Node.js" (und zusätzlichen Paketen wie "Express.js" und "SimpleCGI") lassen sich äußerst schlanke und gleichzeitig leistungsfähige Server erstellen, die in JavaScript programmiert werden.

Ein einfacher HTTP-Server, der Anfragen nach Dateien mit der Endung ".lc" an "LiveCode Server" weiterreicht, sieht mit diesen Systemen wie folgt aus:

#!/usr/bin/env node
var express = require('express');
var SimpleCGI = require('simplecgi');

var oneDay = 24*60*60*1000;

var WebServer = express();
WebServer.use(express.compress());
WebServer.use(express.staticCache());

WebServer.all(/^.+[.]lc$/, SimpleCGI(
'/usr/local/bin/livecode-server', __dirname + '/www', /^.+[.]lc$/
));

WebServer.use(express.static(__dirname + '/www', { maxAge:oneDay }));

WebServer.use(express.errorHandler());
WebServer.listen(8080); // actually starts the server

Mehr ist nicht erforderlich!

Die erste Zeile ist eine sogenannte "Shebang"-Zeile, die unter Mac OS X und Linux den direkten Aufruf der Datei mit diesem Skript ermöglicht - und sollte unter Windows weggelassen werden.

Die Zeilen

WebServer.all(/^.+[.]lc$/, SimpleCGI(
'/usr/local/bin/livecode-server', __dirname + '/www', /^.+[.]lc$/
));

erkennen eine CGI-Anfrage anhand der Endung ".lc" in der URL und leiten sie an "LiveCode Server" weiter. In diesem konkreten Beispiel wird angenommen, dass "LiveCode Server" (wie an anderer Stelle beschrieben) als "Kommandozeilen-Prozessor" installiert wurde. Windows-Benutzer mögen bitte den Installationspfad entsprechend abändern.

Sowohl statische Dateien als auch die Skripte für "LiveCode Server" werden im Unterverzeichnis "www" desselben Verzeichnisses erwartet, in welchem auch der HTTP-Server aufgesetzt wurde. Wer mag, kann die Ausdrücke __dirname + '/www' nach eigenem Gusto anpassen.

Server-Installation

Die komplette Installation des beschriebenen HTTP-Server verläuft wie folgt:
  1. sofern noch nicht geschehen, laden Sie sich von nodejs.org einen Installer für Ihr Betriebssystem herunter und installieren damit Node.js auf Ihrem Rechner;
     
  2. öffnen Sie ein Terminal-Fenster;
     
  3. legen Sie ein Verzeichnis für Ihren HTTP-Server an
     
    mkdir WebServer
     
  4. wechseln Sie in dieses Verzeichnis
     
    cd WebServer
     
  5. installieren Sie Express.js
     
    npm install express
     
  6. installieren Sie SimpleCGI
     
    npm install simplecgi
     
  7. öffnen Sie einen Texteditor und legen Sie damit eine Datei namens WebServer im aktuellen Verzeichnis an. Der Inhalt dieser Datei ist das oben gezeigte Skript - ggfs. mit den von Ihnen gewünschten Änderungen
     
  8. Benutzer von Mac OS X oder Linux sollten das Skript jetzt als ausführbar markieren
     
    chmod +x WebServer
     
    (Windows-Benutzer können diesen Schritt überspringen)
     
  9. legen Sie ein Unterverzeichnis für die Dateien an, die der WebServer ausliefern soll:
     
    mkdir www
Das war's auch schon: Benutzer von Mac OS X oder Linux können die Skript-Datei sofort starten:

./WebServer

Windows-Benutzer geben stattdessen

node WebServer

ein.

Anschließend wartet der frisch gestartete Server an Port 8080 auf Anfragen - evtl. Fehler werden in das noch geöffnete Terminal-Fenster ausgegeben.

Ein paar Test-Skripte

Um die Funktionsfähigkeit des gerade erstellten Server zu testen, können die folgenden kurzen Skripte verwendet werden. Gehen Sie dabei folgendermaßen vor:
  1. erstellen Sie im Unterverzeichnis www Ihres Server eine Datei mit dem angegebenen Namen (also z.B. www/00_SmokeTest.lc)
     
  2. rufen Sie dieses Skript aus Ihrem Browser heraus wie folgt auf:
     
    http://127.0.0.1/00_SmokeTest.lc
     
  3. der Browser sollte nun die von diesem Skript erzeugte Ausgabe anzeigen

00_SmokeTest.lc

Dieser allererste Test soll lediglich einen einfachen Text ausgeben, um das Funktionieren von HTTP-Server und "LiveCode Server" zu demonstrieren:
<?lc
put header "Content-Type: text/plain" & NumToChar(13)

write "LiveCode Server is alive" & LF to stdout # due to LiveCode Server bug!
?>

Wer sich mit "LiveCode Server" auskennt, wird sich vermutlich über zwei Besonderheiten wundern:
  1. put header ... & NumToChar(13)
    "LiveCode Server" schließt Header-Ausgaben nicht mit der Zeichenfolge CR-LF ab (wie vom Standard eigentlich gefordert), sondern nur mit LF - das explizite Anhängen von NumToChar(13) (und nicht der LiveCode-Konstante CR!) an den eigentlichen Header umgeht dieses Problem - wenn auch mit der Nebenwirkung einer Leerzeile am Anfang der eigentlichen Skriptausgabe;
     
  2. write ... & LF to stdout
    wie an anderer Stelle schon beschrieben wurde, funktioniert die Ausgabe mit put aus "LiveCode Server" heraus nicht korrekt. Abhilfe schaffen put binary ... oder eben write ... to stdout

01_EnvironmentVariables.lc

Das zweite Skript zeigt den Inhalt der für CGI-Skripte wichtigen Umgebungsvariablen:

<?lc put header "Content-Type: text/plain" & NumToChar(13)

local KeyList; put the keys of $_SERVER into KeyList
sort lines of KeyList

local maxKeyLength; put 0 into maxKeyLength
repeat for each line Key in KeyList
local KeyLength; put the number of chars of Key into KeyLength
if (KeyLength > maxKeyLength) then; put KeyLength into maxKeyLength; end if
end repeat

repeat for each line Key in KeyList
put the number of chars of Key into KeyLength

write Key to stdout # due to a LiveCode Server bug
repeat with i = KeyLength to maxKeyLength; put " "; end repeat
write "= " & quote & $_SERVER[Key] & quote & LF to stdout # dto.
end repeat
?>

02_SmokeTest.lc

Natürlich können Sie auch HTML-Seiten erstellen, wie das folgende Skript zeigt:
<?lc
put header "Content-Type: text/html" & NumToChar(13)
?>
<!DOCTYPE HTML>
<html>
<head>
<title>LiveCode Server is alive!</title>
</head>
<body>
<h1>LiveCode Server is alive!</h1>
</body>
</html>

03_ErrorInScript.lc

Wie überall sonst auch, können auch in Skripten für "LiveCode Server" Fehler auftreten. Das nächste Skript zeigt, was (ohne weitere Vorkehrungen) in einem solchen Fall passiert:

<?lc put header "Content-Type: text/plain" & NumToChar(13)

throw "Exception thrown in Script"
?>

Wie man unschwer sieht, ist die Skript-Ausgabe ist nicht sonderlich hilfreich...

04_ErrorInScript.lc

Im Allgemeinen hilft ein Umleiten der Fehlerausgaben nach stderr - unser Server protokolliert diese aber nur im Terminal-Fenster: im Browser werden keinerlei Informationen angezeigt (was im Produktionsfall evtl. sogar von Vorteil ist):

<?lc set the ErrorMode to "stderr" # reports any errors on stderr

put header "Content-Type: text/plain" & NumToChar(13)

write "Please, look into the server's log file to see the error message" && \
"issued by this script" & LF to stdout # due to LiveCode Server bug!

throw "Exception thrown in Script"
?>

05_ErrorInScript.lc

Die am ehesten zielführende Lösung ist vermutlich die Bereitstellung einer speziellen Prozedur zur Verarbeitung von (ansonsten unbehandelten) Fehlern:

<?lc --------------------------------------------------------------------------------
-- ScriptExecutionError catches and reports an error in the script --
--------------------------------------------------------------------------------

on ScriptExecutionError ErrorStack, FileList
write "Error in Command-Line Script:" & LF to stdout
write "ErrorStack = " & ErrorStack & LF to stdout
write "FileList = " & FileList & LF to stdout
write "Context = " & the ExecutionContexts & LF to stdout

exit to top
end ScriptExecutionError



put header "Content-Type: text/plain" & NumToChar(13)

throw "Exception thrown in Script"
?>

Wie ein Fehler am sinnvollsten zu behandeln ist, hängt vom jeweiligen Anwendungsfall ab: eine Protokollierung im Terminalfenster (via stderr) dürfte grundsätzlich von Nutzen sein, eine Anzeige in Text- oder HTML-Form zeigt den Benutzer zumindest da Auftreten von Problemen an.

                       
Viel Spaß mit "LiveCode Server" und diesem HTTP-Server! Creative Commons Lizenzvertrag

Literaturhinweise

[1]
(RunRev Ltd.)
LiveCode | LiveCode Server Guide
Der LiveCode Server ist ein Interpreter für LiveCode-Skripte, der von der Kommandozeile aus gestartet wird (ohne grafische Benutzeroberfläche auskommt) und vor allem als CGI-Prozessor gedacht ist (auf diese Weise können Web-Seiten mit LiveCode bearbeitet werden - man muß also nicht mehr unbedingt PHP lernen).
[2]
Joyent Inc.
node.js
Node.js ist zunächst einmal eine Plattform für in JavaScript geschriebene und dennoch äußerst leistungsfähige Netzwerk-Anwendungen. In Verbindung mit weiteren Technologien (wie z.B. Node-WebKit) kann Node.js aber auch für mehr als nur HTTP-Server eingesetzt werden.
[3]
Tj Holowaychuk
Express - node.js web application framework
Express ist ein schlankes Web Application Framework für Node.js. Dank seines "Baukastensystems" ermöglicht Express eine zügige Entwicklung von HTTP-Servern auf Basis von Node.js.