构建一个解析URI的Node.js服务器

时间:2016-11-21 22:19:16

标签: javascript node.js server

我正在学习节点并且已经整合了一个工作服务器和框架。在与一些更有经验的开发人员交谈之后,似乎我正在做不必要的工作来路由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进行此特定练习

1 个答案:

答案 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);

请参阅:http://expressjs.com/