Kleiner Formhandler in node.js

Das ganze läuft getestet nur unter node 0.41

Und wieder .. die node.js Doku empfiehlt sich

In meiner spärlichen Zeit habe ich etwas mit Formularverarbeitung in node.js rumgespielt .. mein Ziel war es Daten nach der Eingabe abzuspeichern und auf einer Folgeseite wieder auszugeben.

Beschränkt habe ich mich erst mal auf die Node Core Module ohne ein extra Modul (das es sicher gibt) einzubinden.

Die Eingabe erfolgt über ein normales HTML File (input.html) die Form ruft mit der Methode “Post” den Pfad “/formhandler” auf.

Die Eingabe wird dann verarbeitet und in einem .json File abgespeichert. (json.json)

Die Ausgabe erfolgt der Einfachheit halber mit einem AJAX Request auf das JSON File und dem Einsatz von JQUERY (output.html).

Hier könnt ihr alle Files runterladen.

Lesen von vorhandenen Files und Ausgabe

function readFile (req, res, filename) {
  var readFile = path.join(process.cwd(), filename); 
  fs.readFile(readFile, function (err, data) {	
    if(err) {  
      res.writeHead(500, {"Content-Type": "text/plain"});  
      res.end(err + "\n");    
      return;  
    }
    res.writeHead(200); 
    res.write(data, "binary");
    res.end();
  });
}
  • keine Magie 🙂 process.cwd() gibt den aktuellen Pfad auf dem Rechner zurück
  • Errors werden abgefangen
  • Ausgabe per res.write

Schreiben des Files

function writeFile (decoded) {	
  var writeFile = path.join(process.cwd(), SAVEFILE); 
  decoded = util.inspect(decoded);
  fs.writeFile(writeFile, decoded, function(err) {
    if(err) {
	   console.log(err);
	} else {
	   console.log("File gespeichert!");
	}
  });		
}
  • ich ermittle das aktuelle Verzeichnis adde den Dateinamen
  • Errorhandling
  • Konsolenausgabe bei Erfolg

Auslesen des Form Submits und der Rest

function readFormSubmit(req, res) {
  if (req.method  'POST') {
    var fullBody = '';
	req.on('data', function(chunks) {
	  fullBody += chunks.toString();
	});
	req.on('end', function() {
	  var decoded = querystring.parse(fullBody);
	  writeFile(decoded);
          readFile(req, res, "output.html");      
	});
  } else {
    res.writeHead(405, "Method not supported", {'Content-Type': 'text/html'});
	res.end('Method not supported');
  }	
}
  • per Formsubmit wird /formhandler aufgerufen und daraufhin diese Funktion
  • node.js ist Non Blocking d.h. wenn nicht alle Elemente auf einmal geliefert werden können läuft eine Schleife die auf neue Elemente wartet und diese aufnimmt (req.on -> data)
  • die “chunks” werden zu einem Ganzen zusammengebaut
  • wenn alle da sind wird das File geschrieben
  • danach rufen wir output.html auf

Der komplette Quelltext:

HOST = null; // localhost
PORT = 8000;
SAVEFILE = "json.json";
var sys = require("sys"),  
    http = require("http"),  
    url = require("url"),  
    path = require("path"), 
    querystring = require("querystring"),
    util = require ("util"), 
    fs = require("fs");
function readFile (req, res, filename) {
  var readFile = path.join(process.cwd(), filename); 
  fs.readFile(readFile, function (err, data) {	
    if(err) {  
      res.writeHead(500, {"Content-Type": "text/plain"});  
      res.end(err + "\n");    
      return;  
    }
    res.writeHead(200); 
    res.write(data, "binary");
    res.end();
  });
}
function writeFile (decoded) {	
  var writeFile = path.join(process.cwd(), SAVEFILE); 
  decoded = util.inspect(decoded);
  fs.writeFile(writeFile, decoded, function(err) {
    if(err) {
	   console.log(err);
	} else {
	   console.log("File gespeichert!");
	}
  });		
}
function readFormSubmit(req, res) {
  if (req.method  'POST') {
    var fullBody = '';
	req.on('data', function(chunks) {
	  fullBody += chunks.toString();
	});
	req.on('end', function() {
	  var decoded = querystring.parse(fullBody);
	  writeFile(decoded);
      readFile(req, res, "output.html");      
	});
  } else {
    res.writeHead(405, "Method not supported", {'Content-Type': 'text/html'});
	res.end('Method not supported');
  }	
}
function startServer() {
  http.createServer(function (req, res) {
    var uri = url.parse(req.url).pathname; //Dateiname
    var filename = path.join(process.cwd(), uri); //Pfad und Filename
    if (uri = '/formhandler') {
      readFormSubmit(req, res);         
    } else {
      path.exists(filename, function (exists) {	
      if(!exists) {  
	    res.writeHead(404, { "Content-Type": "text/plain"});
	    res.end("Not Found");
      } else {
        readFile(req, res, uri);
      }
    });
    }    
  }).listen(PORT, HOST);
  console.log('Server running');
} 
startServer();

Das Programm startet ihr mir -> node formhandler.js
Dann input.html aufrufen .. z.b. so -> http://localhost:8000/input.html und probieren.

Simpler Form Handler in Node.js als ZIP

Leave a Reply

Your email address will not be published. Required fields are marked *