javascript - 构建解析 URI 的 Node.js 服务器

标签 javascript node.js server

我正在学习 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);

等等

参见:http://expressjs.com/

关于javascript - 构建解析 URI 的 Node.js 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40730448/

相关文章:

node.js - 发回响应时发生 Sails 错误

javascript - 如何在 Mongoose 聚合中找到平均值

javascript - 阻止用户使用ajax提交自己的图像?

javascript - 从结果中取消关闭模态

javascript - 按钮文本切换不起作用

javascript - 使用拖动功能的Jquery可拖动约束

javascript - 为什么在对象字面量中的键值对后面留下尾随逗号?

node.js - SSH命令输出到终端但不是控制台登录Electron

java - Netty ByteToMessageDecoder 运行的次数超出了它必须的次数

Java Web 客户端远程连接