Statischer Webserver in node.js

20. Februar 2011

Das ganze hier läuft getestet nur unter node 0.41

Mein erstes Ziel in node.js war es einen simplen Webserver zu bauen der vorhandene Files an den Browser ausliefert und auf nicht vorhandene Files mit einem 404 .. oder was auch immer antwortet.

Dazu empfiehlt es sich die API von Node mal durchzusehen .. da ich ja einige Funktionen brauche die Client JS nicht vorsieht. Ich muss im Filesystem schauen ob die Datei da ist oder nicht .. und ich muss sie ausliefern.

Das Herz dieses kleinen Servers ist folgender Abschnitt:

var server = http.createServer(function (req, res) {
  var uri = url.parse(req.url).pathname; 
  var filename = path.join(process.cwd(), uri);  
  path.exists(filename, function (exists) {	
    if(!exists) {  
	  res.writeHead(404, { "Content-Type": "text/plain"});
  	  res.end("Not Found");
    }
    fs.readFile(filename, 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();
	});
  });
});
  • parsen der URL und abspeichern des Dateinamens (/beispiel.html)
  • process.cwd gibt das aktuelle directory zurück
  • und wir fügen den den Dateinamen an
  • dann schauen wir ob das File auch wirklich auf der Kiste liegt
  • wenn nicht dann Not Found 404
  • wenn ja lesen wir das File aus
  • sollte beim Auslesen noch was schief gehen (err) geben wir das aus
  • ansonsten liefern wir nen 200 an den Browser und geben das File aus

Hier der komplette Quelltext meines statischen Webservers in Node.js:

HOST = null; // localhost
PORT = 8000;
var sys = require("sys"),  
    http = require("http"),  
    url = require("url"),  
    path = require("path"),  
    fs = require("fs");
var server = http.createServer(function (req, res) {
  var uri = url.parse(req.url).pathname; 
  var filename = path.join(process.cwd(), uri);  
  path.exists(filename, function (exists) {	
    if(!exists) {  
	  res.writeHead(404, { "Content-Type": "text/plain"});
  	  res.end("Not Found");
    }
    fs.readFile(filename, 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();
	});
  });
});
listen = function (port, host) {
  server.listen(port, host);
  sys.puts("Server at http://" + (host || "127.0.0.1") + ":" + port.toString() + "/");
};
listen(Number(PORT), HOST);

Kategorie:

---

Kommentare

  1. Danke für den Artikel! Hat mir grade wirklich geholfen.

    (aktuell ist allerdings 0.4x)

    qrios · 8. März 2011, 00:07 · #

  2. Danke .. habs korrigiert

    Matthias · 14. März 2011, 19:59 · #

  3. Nach

    res.end(“Not Found”);

    empfiehlt sich imho ein

    return;

    Sonst führt das zu Frustrationen des Servers, weil er sonst versucht, nicht existierende Dateien zu lesen.

    — Scaramouche · 12. Februar 2013, 08:27 · #

 
---