Node.js-Tutorium: Hello World: Konsole: Unterschied zwischen den Versionen

aus GlossarWiki, der Glossar-Datenbank der Fachhochschule Augsburg
 
(48 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
{{Node.js-Tutorium:HelloWorld:Menü}}
{{Node.js-Tutorium:HelloWorld:Menü}}
==Ziel: Ausgabe von „Hello, world!“ auf der Konsole==
==Use Cases==


Es soll eine einfache Node.js-Anwendung erstellt werden, die <code>Hello, world!</code> bzw. <code>Hello, <BENUTZERNAME>!</code>auf einer Bash-Konsole ausgibt.
Es soll eine einfache Node.js-Anwendung erstellt werden, die <code>Hallo, Welt!</code>  
auf der Konsole ausgibt.
 
Anschließend soll der Benutzer nach einen Nanmen gefragt werden.
Das Programm reagiert darauf mit der Begrüßung <code>Hallo, <BENUTZERNAME>!</code>.
Dieser Vorgang wiederholt sich solange, bis der Benutzer <code>Ende</code>
als „Namen“ eingibt.


==Node.js installieren==
==Node.js installieren==
Zeile 14: Zeile 20:


* Node.js: http://nodejs.org/
* Node.js: http://nodejs.org/
===Anmerkungen zur Git-Bash unter Windows===
In der Git-Bash können Sie mit den Cursortasten „nach oben“ und „nach unten“ zwischen den schon eingebenen Bash-Befeheln hin und her blättern.
In die Git-Bash können Bash-Befehle allerdings nur etwas umständlich per Copy und Paste eingefügt werden:
* Bash-Befehl per <code>Strg-C</code> aus dem Tutorial kopieren.
* Klick auf das kleine Icon in der linken oberen Ecke des Bash-Fensters
* Klick auf <code>Bearbeiten</code>
* Klick auf <code>Einfügen</code>
Auch beim Aufruf des Linux-Editors <code>vi</code> von der Bash-Konsole aus muss man diesen umständlichen Weg gehen.
Wenn allerdings die Node.js-Konsole läuft (siehe nächsten Abschnitt),
geht es etwa einfacher:
* JavaScript-Befehl per <code>Strg-C</code> kopieren.
* Rechtsklick in die Node.js-Konsole
* Klick auf <code>Einfügen</code>


==Node.js in der Bash ausführen==
==Node.js in der Bash ausführen==
Zeile 23: Zeile 48:
</source>
</source>


Es öffnet sich die Node.js-Konsole. Tippen Sie in diese Kolsole <code>"Hello, world!"</code> ein:
Es öffnet sich die Node.js-Konsole. Tippen Sie in diese Konsole <code>"Hallo, Welt!"</code> ein:


<source lang="ecmascript">
<source lang="ecmascript">
> "Hello, world!"
> "Hallo, Welt!"
</source>
</source>


Das Programm antwortet mit der Ausgabe:
Das Programm antwortet mit der Ausgabe:
<source lang="bash">
<source lang="bash">
'Hello, world!'
'Hallo, Welt!'
</source>
</source>


Zeile 38: Zeile 63:
<source lang="ecmascript">
<source lang="ecmascript">
> var benutzer = "Wolfgang"
> var benutzer = "Wolfgang"
> "Hallo, " + benutzer + "!"
> 'Hallo, ' + benutzer + '!'
</source>
</source>


Zeile 66: Zeile 91:
===<code>console.log</code>===
===<code>console.log</code>===
Mit Hilfe des Befehls <code>console.log()</code> ist es möglich, Informationen schon während der Eval-Phase auf der Konsole auszugeben..
Mit Hilfe des Befehls <code>console.log()</code> ist es möglich, Informationen schon während der Eval-Phase auf der Konsole auszugeben..
Tippen Sie in diese <code>console.log("Hello, world!")</code> ein:
Tippen Sie in diese <code>console.log('Hallo, Welt!')</code> ein:


<source lang="ecmascript">
<source lang="ecmascript">
> console.log("Hello, world!")
> console.log('Hallo, Welt!')
</source>
</source>


Das Programm antwortet mit der Ausgabe:
Das Programm antwortet mit der Ausgabe:
<source lang="bash">
<source lang="bash">
Hello, world!
Hallo, Welt!
undefined
undefined
</source>
</source>
Zeile 83: Zeile 108:
===Aufgaben===
===Aufgaben===


Was gibt der Befehl <code>console.log("Hello, " + benutzer + "!")</code> auf der Konsole aus in folgenden Fällen aus?
Was gibt der Befehl <code>console.log('Hallo, ' + benutzer + '!')</code> auf der Konsole aus in folgenden Fällen aus?


# Der Befehl wird direkt im Anschluss an die obigen Befehle in die Node.js-Konsole eingegeben.
# Der Befehl wird direkt im Anschluss an die obigen Befehle in die Node.js-Konsole eingegeben.
# Der Befehl wird nach einem Neustart der Node.js-Konsole eingegeben. (Sie können die Konsole mit <code>Crtl-d</code> bzw- <code>Strg-d</code> beenden.)
# Der Befehl wird nach einem Neustart der Node.js-Konsole eingegeben. (Sie können die Konsole mit <code>Strg-C</code> beenden.)


Was geben folgende Befehle auf der Konsole aus?
Was geben folgende Befehle auf der Konsole aus?
Zeile 98: Zeile 123:
# <code>3+4..toString()</code> (Alternative des vorherigen Befehls bei der das Leerzeichen entfällt)
# <code>3+4..toString()</code> (Alternative des vorherigen Befehls bei der das Leerzeichen entfällt)


Tipp: Sie können mit den Cursortasten „nach oben“ und „nach unten“ zwischen den schon eingegebenen Konsol-Befehlen hin und her blättern.
Tipp: Auch in der Node.js-Konsole können Sie mit den Cursortasten „nach oben“ und „nach unten“ zwischen den schon eingegebenen Konsol-Befehlen hin und her blättern.


Sehr spannend sind auch die folgenden vier Befehle, wobei die Ergebnisse nur von JavaScript-Engine-Programmierern zu verstehen sind.
Sehr spannend sind auch die folgenden vier Befehle, wobei die Ergebnisse nur von JavaScript-Engine-Programmierern zu verstehen sind.
Zeile 108: Zeile 133:
# <code>{} + {}</code>
# <code>{} + {}</code>


Übringens reagiert hier jede JavaScript-Engine anders!
Übrigens reagiert hier jede JavaScript-Engine anders! Man gebe zum Vergleich die vier Befehle mal in die JavaScript-Konsole von Firefox ein.


==Ausführen von Dateien==
==Ausführen von Dateien==


Gehen Sie mit Hilfe des Bash-Befehls <code>cd</code> in das Verzeichnis, indem Sie Ihre Dateien aus
Gehen Sie mit Hilfe des Bash-Befehls <code>cd</code> in das Verzeichnis, indem Sie Ihre Dateien aus
dem ersten Node.js-Tutorium ablegen. Zum Beispiel:
dem ersten Node.js-Tutorium ablegen. '''Zum Beispiel''':


<source lang="bash">
<source lang="bash">
cd /C/web/node/tutorium/hello_world_01
cd /C/web/node/tutorium/hello_world_console
</source>
</source>


Zeile 122: Zeile 147:


<source lang="bash">
<source lang="bash">
mkdir -p /C/web/node/tutorium/hello_world_01
mkdir -p /C/web/node/tutorium/hello_world_console
</source>
</source>


Legen Sie eine Datei namens <code>hello-world-konsole-01.js</code> an und schreiben Sie in diese Datei mit Hilfe Ihres Lieblings-Texteditors (für Bash-Benutzer ist dies selbstverständlich [[vi|<code>vi</code>]]) folgende drei Zeilen:
Legen Sie eine Datei namens <code>hello-world-console-01.js</code> an und schreiben Sie in diese Datei mit Hilfe Ihres Lieblings-Texteditors (für Bash-Benutzer ist dies selbstverständlich [[vi|<code>vi</code>]]) folgende drei Zeilen ([https://github.com/kowarschick/Node.js-Tutorium/blob/master/hello_world_console/hello-world-console-01.js GitHub]):


<source lang="ecmascript">
<source lang="ecmascript">
console.log("Hello, world!");
console.log('Hallo, Welt!');
var benutzer = "Wolfgang";
 
console.log("Hello, " + benutzer + "!");
var v_user = 'Wolfgang';
console.log('Hallo, ' + v_user + '!');
</source>
</source>


Zeile 136: Zeile 162:


<source lang="bash">
<source lang="bash">
less hello-world-konsole-01.js
less hello-world-console-01.js
</source>
</source>


Zeile 142: Zeile 168:


<source lang="bash">
<source lang="bash">
node hello-world-konsole-01.js
node hello-world-console-01.js
</source>
</source>


Zeile 155: Zeile 181:
Es ist auch möglich, Benutzereingaben über die Konsole zu tätigen.  
Es ist auch möglich, Benutzereingaben über die Konsole zu tätigen.  


Erstellen Sie eine Datei <code>hello-world-konsole-02.js</code>
Erstellen Sie eine Datei <code>hello-world-console-02.js</code> ([https://github.com/kowarschick/Node.js-Tutorium/blob/master/hello_world_console/hello-world-console-02.js GitHub])
und fügen Sie folgenden Code ein:
und fügen Sie folgenden Code ein:


Zeile 162: Zeile 188:
// see http://nodejs.org/api/readline.html
// see http://nodejs.org/api/readline.html


var l_readline = require('readline');
'use strict';
var l_rln      = l_readline.createInterface(process.stdin, process.stdout);
 
var v_readline = require('readline');
var v_rl      = v_readline.createInterface
                            ({ input:  process.stdin,
                              output: process.stdout
                            });
 
console.log('Hallo, Welt!');


l_rln.setPrompt('Name: ');
v_rl.setPrompt('Name oder "Ende": ');
l_rln.prompt();
v_rl.prompt();
l_rln.on('line',
v_rl.on('line',
          function(p_input)
        function(p_input)
          { if (p_input === "quit")
        { if (p_input === 'Ende' || p_input === '"Ende"')
              l_rln.close();
          { v_rl.close(); }
            console.log("Hello, " + p_input + "!");
          console.log('Hallo, ' + p_input + '!');
            l_rln.prompt();
          v_rl.prompt();
          }
        }
        )
      )
    .on('close',
    .on('close',
          function()
        function()
           { process.exit(0);
        { console.log('Servus!');
          }
           process.exit();
        );
        }
      );
</source>
</source>


Zeile 185: Zeile 219:


<source lang="bash">
<source lang="bash">
node hello-world-konsole-02.js
node hello-world-console-02.js
</source>
</source>


Sie werden nach einem Namen gefragt. Wenn Sie diesen eingeben, werden die zugehörige Person namentlich begrüßt und Sie werden nach einem weiteren Namen gefragt.
Sie werden nach einem Namen gefragt. Wenn Sie diesen eingeben, werden die zugehörige Person namentlich begrüßt und Sie werden nach einem weiteren Namen gefragt.
Das Programm endet, sobald Sie <code>quit</code> als Namen eingeben.
Das Programm endet, sobald Sie <code>Ende</code> als Namen (oder <code>Strg-D</code>, aber das wird in den Uses Cases nicht gefordert) eingeben.


In diesem Programm wurde das [http://nodejs.org/api/readline.html Readline-Modul von Node.js] verwendet.
===Ausführen des Programms in WebStorm===


==Anmerkungen zur Git-Bash unter Windows==
Sie können das Programm auch innerhalb von [[WebStorm]] ausführen,
indem Sie [[Node.js-Tutorium:_Hello_World#Ausf.C3.BChren_der_Beispiele.2C_Musterl.C3.B6sungen_und_Ihrer_eigenen_L.C3.B6sungen_in_WebStorm|WebStorm installieren
und das Tutoriumsprojekt von GitHub]] herunterladen,
die Datei <code>hello-world-console-02.js</code> öffnen und mittels
„Run-Icon“  ausführen. Das „Run-Icon“ ist ein kleines grünes Dreieck,
das Sie finden, wenn Sie im Projekt-Explorer mit der rechten Maustaste
auf die Datei <code>hello-world-console-02.js</code> klicken.


Auch in der Git-Bash können Sie mit den Cursortasten „nach oben“ und „nach unten“ zwischen den schon eingebenen Bash-Befeheln hin und her blättern.
====Analyse des Programms====


In die Git-Bash können Bash-Befehle allerdings nur etwas umständlich per Copy und Paste eingefügt werden:
In <code>hello-world-console-02.js</code> wird das [http://nodejs.org/api/readline.html Readline-Modul von Node.js] verwendet.
Das Realine-Modul wird mit Hilfe des Node.js-Befehls <code>require</code> eingelesen. Das zugehörige Modulobjekt wird in der
Variablen <code>v_readline</code> gespeichert. (Der Präfix <code>v_</code> des Variablennamens deutet dabei an, dass es sich
bei <code>v_readline</code> um eine Modul'''v'''ariable handelt, auf die nur innerhalb des aktuellen Moduls <code>hello-world-console-02.js</code>
zugegriffen werden kann; vgl. {{Vgl|Multimedia-Programmierung: Style Guide}}.)
 
Das Laden des Readline-Moduls hat zur Folge, dass das Node.js-Programm nicht mehr automatisch beendet wird, nachdem alle Befehle einmal abgearbeitet wurden.
Man muss das Programm also explizit beenden. Die kann entweder durch den Benutzer mittels <code>Strg-D</code> oder mit Hilfe
eines Javascript-Befehls wie <code>process.exit()</code> erfolgen. Die globale Variable
<code>process</code> enthält dabei ein Objekt, das dem Node.js-Programm Zugriff auf den aktuellen, durch den Befehl <code>node</code> gestarteten [[Prozess]]
gestattet (siehe [http://nodejs.org/api/process.html Node.js-Manual]).
 
Das Objekt <code>process</code> stellt nicht nur Methoden wie <code>exit</code> zur Verfügung, sondern bietet auch Zugriff auf die
Standard-[[Stream]]s des Prozesses: <code>stdout</code> (Ausgabe), <code>stderr</code> (Ausgabe von Fehlermeldungen) und <code>stdin</code> (Eingabe).
 
Beispielsweise könnte <code>console.log</code> folgendermaßen definiert werden:
 
<source lang="ecmascript">
console.log = function(p_info)
              { process.stdout.write(p_info + '\n'); };
</source>
 
(Der Präfix <code>p_</code> deutet dabei an, dass es sich
bei <code>p_info</code> um einen [[Parameter|Funktiosnparameter]] handelt; vgl. abermals {{Vgl|Multimedia-Programmierung: Style Guide}}.)
 
Mit Hilfe des Befehls <code>var v_rl = v_readline.createInterface(...)</code> wird ein [[Wrapper]] für die Standardstreams <code>stdin</code>
und <code>stdout</code> erstellt und in der lokalen Variablen <code>v_rl</code> gespeichert. 
Das Readline-Interface bietet einige [[Methode]]n und [[Event]]s, die über die Methoden  und Events der
Standardstreams hinausgehen. Im Hello-Beispiel werden die Methoden zum Setzen (<code>setPrompt</code>) und Schreiben (<code>prompt</code>) eines Promt-Textes
sowie die Events zum Behalndeln von Benutzereingabe-Ereignissen (<code>line</code>) und von Stream-Enede-Eregnissen (<code>close</code>) eingesetzt.
 
===Aufgabe===
Implementieren Sie die [[Node.js-Tutorium:_Hello_World:_Konsole#Use_Cases|Use Cases diese Tutoriums]] indem Sie kein Modul wie <code>Readline</code>
benutzen, sondern direkt auf <code>stdin</code> und <code>stdout</code> zugreifen.


* Bash-Befehl per <code>Strg-c</code> kopieren.
[https://github.com/kowarschick/Node.js-Tutorium/blob/master/hello_world_console/hello-world-console-02a.js Musterlösung]
* Klick auf das kleine Icon in der linken oberen Ecke des Bash-Fensters
* Klick auf <code>Bearbeiten</code>
* Klick auf <code>Einfügen</code>


Acuh beim Aufruf vom <code>vi</code> muss man diesen umständlichen Weg gehen. Wenn allerdings die Node.js-Konsole läuft,
==Fortsetzung des Tutoriums==
geht es etwa einfacher:


* JavaScript-Befehl per <code>Strg-c</code> kopieren.
Sie sollten nun [[Node.js-Tutorium: Hello World: HTTP|Teil 2 des Tutoriums]] bearbeiten.
* Rechtsklick in die Node.js-Konsole
* Klick auf <code>Einfügen</code>


==Quellen==
==Quellen==
Zeile 215: Zeile 282:
* [http://howtonode.org/hello-node HOW TO NODE: Hello Node!]
* [http://howtonode.org/hello-node HOW TO NODE: Hello Node!]


==Fortsetzung des Tutoriums==
==Siehe auch==
* [https://github.com/kowarschick/Node.js-Tutorium/tree/master/hello-world-console Beispiele und Musterlösungen (auf GitHub)]


Sie sollten nun [[Node.js-Tutorium: Hello World 02: HTTP|Teil 2 des Tutoriums]] bearbeiten.
[[Kategorie: Node.js-Tutorium: Hello World]][[Kategorie: Node.js-Beispiele]]
[[Kategorie: Node.js-Tutorium: Hello World]][[Kategorie: Node.js-Beispiel]][[Kategorie:Kapitel:Multimedia-Programmierung:Beispiele]]

Aktuelle Version vom 29. Oktober 2014, 19:21 Uhr

Dieser Artikel erfüllt die GlossarWiki-Qualitätsanforderungen nur teilweise:

Korrektheit: 4
(großteils überprüft)
Umfang: 1
(zu gering)
Quellenangaben: 5
(vollständig vorhanden)
Quellenarten: 5
(ausgezeichnet)
Konformität: 5
(ausgezeichnet)

Node.js-Tutorium Hello World

Übersicht: Teil 1: Konsole | Teil 2: HTTP | Teil 3: TCP

Use Cases

Es soll eine einfache Node.js-Anwendung erstellt werden, die Hallo, Welt! auf der Konsole ausgibt.

Anschließend soll der Benutzer nach einen Nanmen gefragt werden. Das Programm reagiert darauf mit der Begrüßung Hallo, <BENUTZERNAME>!. Dieser Vorgang wiederholt sich solange, bis der Benutzer Ende als „Namen“ eingibt.

Node.js installieren

Für die Realisierung von Node.js-Projekten benötigt man außerdem auf jeden Fall eine Konsole, am Besten eine Unix-Konsole wie die Bash. Unter Linux und Mac gibt es eine derartige Konsole bereits, unter Window kann man die „Git BASH“ verwenden:

Des weiteren benötigt man natürlich Node.js:

Anmerkungen zur Git-Bash unter Windows

In der Git-Bash können Sie mit den Cursortasten „nach oben“ und „nach unten“ zwischen den schon eingebenen Bash-Befeheln hin und her blättern.

In die Git-Bash können Bash-Befehle allerdings nur etwas umständlich per Copy und Paste eingefügt werden:

  • Bash-Befehl per Strg-C aus dem Tutorial kopieren.
  • Klick auf das kleine Icon in der linken oberen Ecke des Bash-Fensters
  • Klick auf Bearbeiten
  • Klick auf Einfügen

Auch beim Aufruf des Linux-Editors vi von der Bash-Konsole aus muss man diesen umständlichen Weg gehen. Wenn allerdings die Node.js-Konsole läuft (siehe nächsten Abschnitt), geht es etwa einfacher:

  • JavaScript-Befehl per Strg-C kopieren.
  • Rechtsklick in die Node.js-Konsole
  • Klick auf Einfügen

Node.js in der Bash ausführen

Öffnen Sie ein Bash-Konsolfenster und starten Sie Node.js, indem Sie den Befehl node eintippen:

$ node

Es öffnet sich die Node.js-Konsole. Tippen Sie in diese Konsole "Hallo, Welt!" ein:

> "Hallo, Welt!"

Das Programm antwortet mit der Ausgabe:

'Hallo, Welt!'

Tippen Sie nun folgende Befehle ein:

> var benutzer = "Wolfgang"
> 'Hallo, ' + benutzer + '!'

Das Programm antwortet nach dem ersten Befehl mit der Ausgabe:

undefined

und nach dem zweiten Befehl mit der Ausgabe:

'Hallo, Wolfgang!'

Read–Eval–Print-Loop

Die Node.js-Konsole realisiert eine sogenannte Read–Eval–Print-Loop. Das bedeutet, solange die Node.js-Konsole läuft, führt sie immer wieder folgende drei Befehle aus:

  1. Read: Einlesen, parsen und übersetzen der Benutzereingabe.
  2. Eval: Ausführen (“evaluate”) des übersetzten Codes.
  3. Print: Ausgeben des Ergebnises auf der Konsole.

Falls ein Befehl kein Ergebnis liefert, wird undefined als Ergebnis ausgeliefert. Das ist z.B. bei der Definition und Initialisierung der Variablen benutzer der Fall.

console.log

Mit Hilfe des Befehls console.log() ist es möglich, Informationen schon während der Eval-Phase auf der Konsole auszugeben.. Tippen Sie in diese console.log('Hallo, Welt!') ein:

> console.log('Hallo, Welt!')

Das Programm antwortet mit der Ausgabe:

Hallo, Welt!
undefined

Die erste Ausgabe erfolgt während der Eval-Phase, die zweite Ausgabe erfolgt während der Print-Phase und zeigt das Ergebnis des Aufrufs der Funktion console.log an.

Aufgaben

Was gibt der Befehl console.log('Hallo, ' + benutzer + '!') auf der Konsole aus in folgenden Fällen aus?

  1. Der Befehl wird direkt im Anschluss an die obigen Befehle in die Node.js-Konsole eingegeben.
  2. Der Befehl wird nach einem Neustart der Node.js-Konsole eingegeben. (Sie können die Konsole mit Strg-C beenden.)

Was geben folgende Befehle auf der Konsole aus?

  1. 3+4
  2. 3+ gefolgt von der Return-Taste und anschließend 4
  3. console.log(3+4)
  4. console.log(3+4, 3*4)
  5. (3+4).toString()
  6. 3+4 .toString() (Das Leerzeichen ist wichtig!)
  7. 3+4..toString() (Alternative des vorherigen Befehls bei der das Leerzeichen entfällt)

Tipp: Auch in der Node.js-Konsole können Sie mit den Cursortasten „nach oben“ und „nach unten“ zwischen den schon eingegebenen Konsol-Befehlen hin und her blättern.

Sehr spannend sind auch die folgenden vier Befehle, wobei die Ergebnisse nur von JavaScript-Engine-Programmierern zu verstehen sind. Für jeden Normalbürger sind sie nicht nur überraschend, sondern auch noch vollkommen unintuitiv:

  1. [] + []
  2. [] + {}
  3. {} + []
  4. {} + {}

Übrigens reagiert hier jede JavaScript-Engine anders! Man gebe zum Vergleich die vier Befehle mal in die JavaScript-Konsole von Firefox ein.

Ausführen von Dateien

Gehen Sie mit Hilfe des Bash-Befehls cd in das Verzeichnis, indem Sie Ihre Dateien aus dem ersten Node.js-Tutorium ablegen. Zum Beispiel:

cd /C/web/node/tutorium/hello_world_console

Wenn es dieses Verzeichnis noch nicht gibt, müssen Sie es vorher erstellen:

mkdir -p /C/web/node/tutorium/hello_world_console

Legen Sie eine Datei namens hello-world-console-01.js an und schreiben Sie in diese Datei mit Hilfe Ihres Lieblings-Texteditors (für Bash-Benutzer ist dies selbstverständlich vi) folgende drei Zeilen (GitHub):

console.log('Hallo, Welt!');

var v_user = 'Wolfgang';
console.log('Hallo, ' + v_user + '!');

Mit dem Bash-Befehl less können Sie den Inhalt auflisten:

less hello-world-console-01.js

Und mit Hilfe des Befehls node können Sie den Inhalt der Datei übersetzen und ausführen:

node hello-world-console-01.js

Folgende Unterschiede zur Read-Eval-Print-Loop sind zu beobachten:

  • Alle Befehle werden auf einmal übersetzt.
  • Die einzelnen Befehle müssen daher durch Strichpunkte voneinander getrennt werden.
  • Die Ergebnisse einzelnen Befehle werden nicht auf der Konsole ausgegeben. Es werden nur die Ausgaben der console.log-Befehle in der Konsole angezeigt.

Benutzereingaben

Es ist auch möglich, Benutzereingaben über die Konsole zu tätigen.

Erstellen Sie eine Datei hello-world-console-02.js (GitHub) und fügen Sie folgenden Code ein:

// see http://stackoverflow.com/questions/8128578/reading-value-from-console-interactively
// see http://nodejs.org/api/readline.html

'use strict';

var v_readline = require('readline');
var v_rl       = v_readline.createInterface
                            ({ input:  process.stdin,
                               output: process.stdout
                            });

console.log('Hallo, Welt!');

v_rl.setPrompt('Name oder "Ende": ');
v_rl.prompt();
v_rl.on('line',
        function(p_input)
        { if (p_input === 'Ende' || p_input === '"Ende"')
          { v_rl.close(); }
          console.log('Hallo, ' + p_input + '!');
          v_rl.prompt();
        }
       )
    .on('close',
        function()
        { console.log('Servus!');
          process.exit();
        }
       );

Starten Sie nun dieses Programm mit Hilfe des Befehls

node hello-world-console-02.js

Sie werden nach einem Namen gefragt. Wenn Sie diesen eingeben, werden die zugehörige Person namentlich begrüßt und Sie werden nach einem weiteren Namen gefragt. Das Programm endet, sobald Sie Ende als Namen (oder Strg-D, aber das wird in den Uses Cases nicht gefordert) eingeben.

Ausführen des Programms in WebStorm

Sie können das Programm auch innerhalb von WebStorm ausführen, indem Sie WebStorm installieren und das Tutoriumsprojekt von GitHub herunterladen, die Datei hello-world-console-02.js öffnen und mittels „Run-Icon“ ausführen. Das „Run-Icon“ ist ein kleines grünes Dreieck, das Sie finden, wenn Sie im Projekt-Explorer mit der rechten Maustaste auf die Datei hello-world-console-02.js klicken.

Analyse des Programms

In hello-world-console-02.js wird das Readline-Modul von Node.js verwendet. Das Realine-Modul wird mit Hilfe des Node.js-Befehls require eingelesen. Das zugehörige Modulobjekt wird in der Variablen v_readline gespeichert. (Der Präfix v_ des Variablennamens deutet dabei an, dass es sich bei v_readline um eine Modulvariable handelt, auf die nur innerhalb des aktuellen Moduls hello-world-console-02.js zugegriffen werden kann; vgl. Multimedia-Programmierung: Style Guide.)

Das Laden des Readline-Moduls hat zur Folge, dass das Node.js-Programm nicht mehr automatisch beendet wird, nachdem alle Befehle einmal abgearbeitet wurden. Man muss das Programm also explizit beenden. Die kann entweder durch den Benutzer mittels Strg-D oder mit Hilfe eines Javascript-Befehls wie process.exit() erfolgen. Die globale Variable process enthält dabei ein Objekt, das dem Node.js-Programm Zugriff auf den aktuellen, durch den Befehl node gestarteten Prozess gestattet (siehe Node.js-Manual).

Das Objekt process stellt nicht nur Methoden wie exit zur Verfügung, sondern bietet auch Zugriff auf die Standard-Streams des Prozesses: stdout (Ausgabe), stderr (Ausgabe von Fehlermeldungen) und stdin (Eingabe).

Beispielsweise könnte console.log folgendermaßen definiert werden:

console.log = function(p_info) 
              { process.stdout.write(p_info + '\n'); };

(Der Präfix p_ deutet dabei an, dass es sich bei p_info um einen Funktiosnparameter handelt; vgl. abermals Multimedia-Programmierung: Style Guide.)

Mit Hilfe des Befehls var v_rl = v_readline.createInterface(...) wird ein Wrapper für die Standardstreams stdin und stdout erstellt und in der lokalen Variablen v_rl gespeichert. Das Readline-Interface bietet einige Methoden und Events, die über die Methoden und Events der Standardstreams hinausgehen. Im Hello-Beispiel werden die Methoden zum Setzen (setPrompt) und Schreiben (prompt) eines Promt-Textes sowie die Events zum Behalndeln von Benutzereingabe-Ereignissen (line) und von Stream-Enede-Eregnissen (close) eingesetzt.

Aufgabe

Implementieren Sie die Use Cases diese Tutoriums indem Sie kein Modul wie Readline benutzen, sondern direkt auf stdin und stdout zugreifen.

Musterlösung

Fortsetzung des Tutoriums

Sie sollten nun Teil 2 des Tutoriums bearbeiten.

Quellen

Siehe auch