Правильный способ маршрутизации различных типов запросов на сервере NodeJS? - PullRequest
1 голос
/ 17 марта 2020

Спасибо, что нашли время, чтобы прочитать это. Я новичок в NodeJS, и в качестве первого проекта я создал свой собственный сервер с маршрутизатором и обработчиком запросов в среде Node. Я сделал это без использования каких-либо модулей и / или структур. Я был успешным и вполне доволен тем, что построил; есть одна деталь, которую я не могу не задавать. Сервер должен иметь некоторый способ узнать, что он маршрутизирует, чтобы ответить с правильным заголовком. Я решил эту проблему с помощью заголовков объектов запроса.

req.headers

данные, возвращенные из описанного выше метода, были не очень организованы, поэтому я вроде как нашел то, что мне нужно, вырвав из заголовка с этим битом кода:

request.headers.accept.split(',')[0];

, который возвращает часть строки с запрашиваемым типом содержимого, которая работает и служит всем целям, но является ли это правильным способом запросы на маршрутизацию разных типов контента?

  • В соответствии с запросом ниже приведены мой сервер, обработчик и маршрутизатор ('server. js' / 'router. js' / 'handler. js «). Существует также main. js, но он просто вызывает метод start () и инициализирует файл env. Я знаю, что этот код далек от совершенства, поэтому я здесь спрашиваю о правильном способе обработки запроса.
  • Сервер:
const http = require('http');
const url = require('url'); 
const port = 8888;

function start(route){
    function onRequest(request, response){
        console.log('[Server]: Request recieved.');

        var reqInfo = [];
        reqInfo['pathname'] = url.parse(request.url).pathname;   
        reqInfo['ctype'] = request.headers.accept.split(',')[0];

        route(reqInfo, response);
    };

    http.createServer(onRequest).listen(port);
    console.log('[Server]: Started!');
};



exports.start = start;
  • Маршрутизатор:
const routerConf = require('./routerConf.json');
const handler = require('./handler');




function route(reqInfo, response){         

    console.log('[Router]: Routing to ', reqInfo['pathname'], );

    switch(reqInfo['ctype']){

        case     'text/html':
                if(routerConf[reqInfo['pathname']]){
                    console.log('[Router]: Routing Content-Type: "text/HTML"');
                    handler.html(response, routerConf[reqInfo['pathname']]);
                } else {
                    console.log('\t! ERROR: no handle for ' + reqInfo['pathname']);

                    response.writeHead(400, {'Content-Type': 'text/html'});
                    response.write('<h1 style="text-align: center; margin-top: 45vh; color=#800;">Error! 400 - Bad Request</h1>');
                    response.end();
                }
            break;




        case 'text/css':
            console.log('[Router]: Routing Content-Type: "text/CSS"');
            handler.css(response, reqInfo['pathname']);

            break;




        default:
            console.log('[Router]: Routing Content-Type: "text/plain"');

            handler.scriptText(response, reqInfo['pathname']);
            break;
    }
}

exports.route = route;
  • Обработчики:
const routerConf = require('./routerConf.json');
const fs = require('fs');



// HTML/VIEW RESPONSE ------------------------ 
function html(response, pathname){
    var viewsPath = (process.env.apppath).concat('/view/' + pathname + '.html')

    console.log('[Handler]: "text/HTML" -- Attempting to load' + viewsPath);

    fs.readFile(viewsPath, (err, data)=>{
        if(err){
            console.log("ERROR OCCURED");
        }

        response.writeHead(200, {'Content-Type': 'text/html'}); 
        response.write(data);
        response.end();
    });
};




//  CSS RESPONSE ------------------------
function css(response, pathname){
    let csspath = process.env.apppath.concat(pathname);

    if(fs.existsSync(csspath)){
        fs.readFile(csspath, (err, data)=>{
            if(err) throw console.error('Problem reading: ' + csspath);

            response.writeHead(200, {'Content-Type': 'text/css'});
            response.write(data);
            response.end();
        });

    }else{
        console.log('404 - CSS Not found: ' + csspath);

        response.writeHead(404, {'Content-Type': 'text/plain'});
        response.end();
    };
};



// JAVASCRIPT/TEXT RESPONSE ------------------------
function scriptText(response, pathname){
    let scriptpath = process.env.apppath.concat(pathname);
    if(fs.existsSync){
        fs.readFile(scriptpath, (err, data)=>{
            response.writeHead(200, {'Content-Type': 'text/plain'});
            response.write(data);
            response.end();
        });
    } else {
        console.log('SCRIPT CANNOT BE FOUND! ' + csspath);

        response.writeHead(404, {'Content-Type': 'text/plain'});
        response.write('alert("Script Not found")');
        response.end();
    }
}




exports.html = html;
exports.css = css;
exports.scriptText = scriptText;
...