Сообщество IT-специалистов
Ответы на любые вопросы об IT
Профессиональное развитие в IT
Удаленная работа для IT-специалистов
var http = require('http'), url = require('url'), fs = require('fs'), mime = require('mime'), swig = require('swig'); /** Front-end директория */ var WDIR = './web', /** Директория шаблонов ошибок */ EDIR = WDIR + '/_errors', /** Путь к макету сайта */ LAYOUT = WDIR + '/layout.html', /** Файлы которые нельзя вызвать по ссылке */ EXCLUDE = [LAYOUT], /** Кодировка на сервере */ CHARSET = 'UTF-8'; /** Запускаем сервер */ http.createServer(function(req, res) { res.setHeader('Content-Type', 'text/plain; charset=' + CHARSET); var pathToFile = url.parse(req.url).pathname; pathToFile = pathToFile == '/' ? '/index.html' : pathToFile; display(res, WDIR + pathToFile); }).listen(80); /** * Открываем файл в окне браузера * * @param res * @param pathToFile * @param isError - если пытаемся показать шаблон ошибки */ function display(res, pathToFile, isError) { if (in_array(pathToFile, EXCLUDE)) { getError(isError, res, 404); return; } fs.readFile(pathToFile, function(err, data) { if (err) { getError(isError, res, 404); return; } var mimeFile = setHeader(res, pathToFile); if (mimeFile == 'text/html') { swig.setDefaults({ cache: false }); data = swig.render(data.toString(), { filename: LAYOUT }); } res.end(data); }); } /** * Установка заголовка * * @param res * @param pathToFile * @returns {string} MIME-файла или Content-Type */ function setHeader(res, pathToFile) { var mimeFile = mime.lookup(pathToFile); res.setHeader('Content-Type', mimeFile + '; charset=' + CHARSET); return mimeFile; } /** * Возвращаем ошибку * * @param mode - без шаблонный режим, если шаблон не загрузился * для исключения зацикливания при невозможности загрузить шаблон ошибки * @param res * @param code - код ошибки */ function getError(mode, res, code) { var template = EDIR + '/' + code + '.html'; if (mode) { console.error('Отсутствует шаблон ошибки: ' + template); res.end('Произошла ошибка!'); } else { res.statusCode = code; display(res, template, 1); } } /** * Проверка наличия элемента в массиве по значению * * @param value * @param array * @returns {boolean} */ function in_array(value, array) { for(var i = 0; i < array.length; i++) { if(array[i] == value) return true; } return false; }