Спасибо, что нашли время, чтобы прочитать это. Я новичок в 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;