我正在学习节点并且已经整合了一个工作服务器和框架。在与一些更有经验的开发人员交谈之后,似乎我正在做不必要的工作来路由URI。很明显,http模块已经内置了所有这些功能,但我不确定它们是什么或如何应用它们。
这是我当前的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;
基本上,我将每个URI与"路由"中的键匹配。对象并加载相应的控制器。 (通常,我会使用Regex扩展此功能,但现在只是保持简单)。
Node" http"模块(或任何其他模块)已经内置了解析URI的函数,这样我就不必使用自定义构建的路由器了吗?
请注意:我正在使用本机节点并尝试避免Express.js进行此特定练习
答案 0 :(得分:1)
注意:这个答案是在将此附加要求添加到答案之前编写的:“我正在使用本机节点并尝试避免使用Express进行此特定练习”
有很多Node模块可以用来简化你在这里做的事情。
例如,您可以使用Express:
var app = require('express')();
app.get('/path1', path1Handler);
app.get('/path2', path2Handler);
app.use('/static', express.static(pathToStaticFiles));
app.listen(3333);
等