node.js – Eine Einführung (HTTP Log Server)
In der letzten Zeit hatte ich nicht viel Gelegenheit, einen neuen Beitrag zu schreiben. Heute ist es endlich soweit! Wie soll es auch anders sein – heute geht es um Javascript. Zwar nicht Clientseitig – aber trotzdem ist und bleibt es Javascript. Node.js ist ein Event basiertes I/O Javascript Framework für die V8 JavaScript-Engine (vergleichbar mit Twisted). Node kann für viele Bereiche eingesetzt werden – meiner Meinung nach ist der Wichtigste jedoch WebSockets. Jedoch möchten wir uns heute nur mit der Einführung beschäftigen.
Die Installation:
Die Installation ist schnell beschrieben und vollzogen. Grundsätzlich muss der jeweilige Server, auf dem Node installiert werden soll, nur folgende Befehle ausführen:
git clone https://github.com/joyent/node.git
Option (nicht notwendig):
export JOBS=2
Setzt die Anzahl der parallelen Jobs.
Anschließend wechselt man in das node/ Verzeichnis und führt dort folgende Befehle aus:
mkdir ~/local ./configure --prefix=$HOME/local/node make make install export PATH=$HOME/local/node/bin:$PATH
Zusätzlich ist es zu empfehlen, NPM (ein Package Manager) zu installieren:
curl http://npmjs.org/install.sh | sh
Anschließend können Pakete wie folgt installiert werden:
npm install [PACKAGENAME]
NPM is a package manager that has become the de-facto standard for installing additional node libraries and programs. Here’s the quick and easy one-liner for installing on Unix.
Wenn das ganze getan ist, kann Node.js verwendet werden.
2. Die ersten Schritte
Node.js bietet wie o.g. viele Möglichkeiten – jedoch sind die meisten davon für den Anfang etwas übertrieben. Heute möchten wir uns zunächst einmal mit etwas einfachen beschäftigen: Einem HTTP Log-Server. Ziel ist es, unsere Daten in eine Log-Datei zu speichern (in diesem Beispiel /var/log/node.log), und diese mit einem MS Timestamp zu versehen.
Code:
var http = require('http'), url = require('url'), fs = require('fs'), sys = require('sys'), server = null; var LOGFILE = '/var/log/node.log'; server = http.createServer(function(request, response) { var params = url.parse(request.url, true), toSend = {}, message = ''; response.writeHead(200, { 'Content-Type': 'text/plain' }); if (params.query.hasOwnProperty('message') === true && typeof params.query.message === 'string' ) { message = '[' + new Date().getTime() + '] ' + params.query.message + '\n'; fs.open(LOGFILE, 'a', 666, function(error, id) { fs.write(id, message, null, 'utf8', function() { sys.puts('Write ' + params.query.message + ' to ' + LOGFILE + '.'); fs.close(id, function() { sys.puts('File ' + LOGFILE + ' closed.'); }) }); }); toSend = { saved: true, message: params.query.message }; } else { toSend = { saved: false }; } response.write(JSON.stringify(toSend)); response.end(); }); server.listen(8078, 'node.mrboolean.com');
Erläuterung:
Jedes Modul kann in node mit require geladen werden. Also Beispielsweise:
var http = require('http');
Diese Module können dann benutzt werden. So kann man mit http nun einen neuen Server erstellen, der auf einen bestimmten Port lauscht. Grundsätzlich ist es so, dass der Server keine Response liefert. Deswegen kann im CallBack eine Ausgabe definiert werden:
response.writeHead(200, { 'Content-Type': 'text/plain' }); response.write('Clientmessage.'); response.end();
Den Request kann man mit dem Modul URL weiterverarbeiten:
var params = url.parse(request.url, true);
Nun haben wir: params.query.message – also die jeweilige Message, die der Nutzer mitgibt, als Parameter zur Verfügung.
Jetzt müssen wir nur noch die Nachricht mit einem MS Timestamp in einer Datei speichern:
fs.open(LOGFILE, 'a', 666, function(error, id) { fs.write(id, message, null, 'utf8', function() { sys.puts('Write ' + params.query.message + ' to ' + LOGFILE + '.'); fs.close(id, function() { sys.puts('File ' + LOGFILE + ' closed.'); }) }); });
Wichtig: Die Datei muss zunächst geöffnet werden, damit das File-System Modul weis, dass die jeweilige Datei schon Content besitzt. Andernfalls wird die Datei immer wieder überschrieben.
3. Weiterführendes
Node.js API Documentation
FS
HTTP
URL