我正在学习 Node ,并已经组装了一个工作服务器和框架。在与一些更有经验的开发人员交谈后,我似乎在路由 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 与“routes”对象中的键进行匹配并加载相应的 Controller 。 (通常,我会使用正则表达式扩展此功能,但现在只是保持简单)。
Node “http”模块(或任何其他模块)是否已经具有解析 URI 的内置函数,这样我就不必使用自定义构建的路由器?
请注意:我正在使用 native Node 并尝试避免 Express.js 来进行此特定练习
最佳答案
注意:此答案是在将此附加要求添加到答案之前编写的:“我正在使用 native Node 并尝试避免使用 Express 进行此特定练习”
有很多 Node 模块可用于简化您在这里所做的事情。
例如,您可以使用 Express:
var app = require('express')();
app.get('/path1', path1Handler);
app.get('/path2', path2Handler);
app.use('/static', express.static(pathToStaticFiles));
app.listen(3333);
等等
关于javascript - 构建解析 URI 的 Node.js 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40730448/