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
ah! Entschuldigung, ich hätte erwähnen sollen, ich benutze native Knoten und versuche, Express zu vermeiden – yevg