NodeJS Server liefert CSS Dateien nicht immer aus

philishake

javascript enthusiast
Hallo liebe Community,

ich habe vor kurzem angefangen NodeJS zu lernen. Dazu habe ich einen eigenen kleinen Webserver geschrieben. Dieser funktioniert auch einwandfrei, ausser fuer CSS Dateien. Nach etlichem debugging und Suchen (stackoverflow, etc) konnte ich das Problem leider nicht loesen. Ich hab das ganze gleich als Node-Module gebaut. Hier mal mein Code:
Javascript:
var FileSystem, Http, UrlParser, ContentTypes, ContentDefault,
        DefaultFile, Logger;

Logger = require('./Logger.js');
FileSystem = require('fs');
Http = require('http');
UrlParser = require('url');

ContentDefault = {
    status: 200, header: "text/plain"
};

DefaultFile = "/public/index.html";

ContentTypes = {
    ".html": {status: 200, header: "text/html"},
    ".js": {status: 200, header: "application/javascript"},
    ".css": {status: 200, header: "text/css"},
    ".txt": {status: 200, header: "text/plain"},
    ".json": {status: 200, header: "application/json"},
    ".php": {status: 200, header: "application/php"},
    ".ico": {status: 200, header: "image/x-icon"}
};


exports.createHttpServerListener = function createHttpServerListener(port) {

    var parsedUrl, requestUrl, directory, server;

    server = Http.createServer(function requestListener(request, response) {

        parsedUrl = UrlParser.parse(request.url);
        requestUrl = parsedUrl.pathname.split('/');
        directory = __dirname.replace(/\\/, "/");

        // /module/controller/function/param1/val1/...
        if (requestUrl.indexOf('.') === 0) {

            // controller request
            // deliver index.html with game data
            // check for security
            Logger.LOG('\nWARNING: Controller request which is not handled!');
        }

        if (parsedUrl.pathname === "/") {

            // index.html
            parsedUrl.pathname = DefaultFile;
        }


        FileSystem.readFile('.' + parsedUrl.pathname, function(error, content) {

            var ext, extIndex, status, header;

            if (error) {

                response.writeHead(500);

                Logger.LOG('ERROR: FILE READ ERROR 404/500', parsedUrl.pathname);

                return response.end();
            }

            extIndex = parsedUrl.pathname.indexOf(".");
            ext = parsedUrl.pathname.substring(extIndex);

            if (ContentTypes[ext]) {
                status = ContentTypes[ext].status;
                header = ContentTypes[ext].header;
            } else {
                status = ContentDefault.status;
                header = ContentDefault.header;
                Logger.LOG('ERROR: File-Extension not found: ', ext);
            }

            Logger.LOG(header, status, parsedUrl.pathname);

            response.setHeader('Content-Type', header);
            response.writeHead(status, header);

            return response.end(content);
        });
    });

    server.listen(port);

    return server;
};

Das ganze kann man auch auf Github finden: https://github.com/Luketep/node_rts/blob/master/HTTPServer.js
Hier koennt ihr auch das ganze Projekt sehen, falls ihr es mal lokal probieren wollt. Lest dazu einfach die Readme.md

Es kommt auch vor das zwischendurch (nach mehrmaligen oder einfachen refresh) das CSS geladen wird, aber das ist sehr sporadisch.

Lieben Dank fuer's Lesen!
 
Hallo,

kommt denn ein Fehler in der Konsole, in der du die NodeJS-Instanz ausführst?
Was kommt auf der Clientseite an? Ein 404? Schau mal in die Entwicklerkonsole / Netzwerklog.
 
Kein negatives Feedback in der Konsole. Es wird mir angezeigt das er jedes mal versucht die css datei zu laden, allerdings in 99% der falle als mime type app../js. Logging im server zeigt nicht an, dass die Datei angefragt wird, obwohl im Network-Tab von Google die Datei zu sehen ist.
 
Hallo,

kenne Node.js nur vom lesen, aber du baust dir da eine Erkennung an Hand der Dateierweiterung ein, und ich denke, dass dort der Fehler zu suchen wäre. Allerdings gibt es dafür schon ein Modul, was diese Aufgabe erledigt, vielleicht kann es das ja besser als dein Code?

https://github.com/broofa/node-mime
 
Die Erkennung ist nicht das Problem. Wenn ich einfach jeden Datei, die beim Server angefragt ist logge, dann fehlt die CSS Datei im Server-Log, obwohl sie im Network tab von Chrome angezeigt wird. Nur halt mit MIME-Type Application/Javascript.
Ich moechte keine Library nutzen, da ich lernen und verstehen will, sonst wuerde ich Express nutzten ;)
 
Das kann nicht sein.
Bist du sicher, dass du jede Anfrage loggst? Auch HEAD-Anfragen?

Lösch mal den Chrome-Cache und unterbinde Caching direkt in der Entwicklerkonsole.
 
Ihr koennt euch das ganze Projekt auf github anschauen. Einfach die Sandbox.html aufrufen. Beschreibung liegt in der Readme.md.
Ich glaube, dass Problem ist 'FileSystem.readFile'. Logge ich davor ist die css Datei immer dabei, nur der Callback von readFile wird nicht immer fuer die css Datei ausgefuehrt, auch wenn ich einen Hard-Refresh mache.
 
  • Gefällt mir
Reaktionen: en1
Zurück