2016-11-21 4 views
0

Ich lerne Knoten und habe einen funktionierenden Server und ein Framework zusammengestellt. Nachdem ich mit einigen erfahrenen Entwicklern gesprochen habe, scheint es, dass ich unnötige Arbeit verrichten muss, um den URI zu routen. Offensichtlich hat das HTTP-Modul alle diese Funktionen bereits eingebaut, obwohl ich mir nicht sicher bin, was sie sind oder wie man sie anwendet.Erstellen eines Node.js-Servers, der den URI analysiert

Hier ist meine aktuellen server.js

// SERVER 
var http  = require('http'); 
var url   = require('url'); 
var fs   = require('fs'); 
var lib   = require('scripts'); // some custom libraries I use 
var path  = require('path'); 
var NodeSession = require("node-session"); 
var _SESSION = new NodeSession({secret: 'Q3UBzdH9GEfiRCTKbi5MTPyChpzXLsTD'});  

// uri slug -> controller file 
var routes = { 

    // Dependencies 
    '/style'  : 'control_style',  // CSS stylesheets 
    '/fonts'  : 'control_fonts',  // Fonts 
    '/scripts'  : 'control_scripts',  // JS library and controls 
    '/public'  : 'control_public',  // Public Resources 

    // Page Routes 
    '/'    : 'control_home',   // root path 
    '/login'  : 'control_login',  // login path 
    '/logout'  : 'control_logout',  // logout path 
    '/admin'  : 'control_admin',  // admin panel path 
    '/test'   : 'control_test',   // test page 
    '/upload'  : 'control_upload',  // upload test page 

}; 

// Main Loop 
function start(){ 

    var port = process.env.PORT || 8080; 

    http.createServer(function onRequest(request, response) { 

     var pathname = url.parse(request.url).pathname; 

     _SESSION.startSession(request, response, function(){ 

      lib._post(request, function(_POST, form, files){ // grabs and parses post data 

       // file system objects that may be needed in controllers 
       var _SYSTEM = {fs, form, files, path, pathname}; 

       // get the respective controller module 
       var module = routes[pathname]; 

       // hack for uri's referencing public directory 
       if(pathname.includes('/public')) module = routes['/public']; 

       if(module!=null) { // load the respective controller 

        console.log("controller: "+module+".js"); 
        var controller = require("../controller/"+module); 
        controller.data(response, request, _SYSTEM, _POST, _SESSION); 

       } else { // Not Found 

        console.log(pathname+' => Not Found'); 
        response.writeHead(200, {"Content-Type": "text/plain"}); 
        response.write("Path not found"); 
        response.end(); 
       } 

      }); 

     }); 

    }).listen(port); 

    console.log("Server has started."); 

} 

exports.start = start; 

Grundsätzlich Im jede URI auf einen Schlüssel in der „Routen“ Objekt passenden und dem jeweiligen Controller geladen wird. (Normalerweise würde ich diese Funktionalität mit Regex erweitern, aber einfach für den Moment einfach halten).

Hat das Knoten "http" Modul (oder ein anderes Modul) bereits die Funktionen zum Parsen von URI, so dass ich keinen benutzerdefinierten Router verwenden muss?

Bitte beachten Sie: Ich nativen Knoten bin mit und versuchen Express.js für diese besondere Übung

Antwort

1

Hinweis zu vermeiden: Diese Antwort wurde geschrieben, bevor diese zusätzliche Anforderung an die Antwort gegeben: „Ich bin mit nativer Knoten und versuchen zu vermeiden, Express für diese bestimmte Übung zu verwenden "

Es gibt eine Menge von Knoten-Modulen, die verwendet werden können, um zu vereinfachen, was Sie hier tun.

Zum Beispiel können Sie Express verwenden:

var app = require('express')(); 

app.get('/path1', path1Handler); 
app.get('/path2', path2Handler); 
app.use('/static', express.static(pathToStaticFiles)); 

app.listen(3333); 

usw.

See: http://expressjs.com/

+0

ah! Entschuldigung, ich hätte erwähnen sollen, ich benutze native Knoten und versuche, Express zu vermeiden – yevg

Verwandte Themen