Рассмотрим небольшой код для создания веб-приложения с помощью простого шаблона проектирования
http = require(‘http’); fs = require(‘fs’); var server = http.createServer(function(req,res){ getData(res); }).listen(3000); // функция getData извлекает данные и передает выполнение кода функции getTemp (если ошибок нет) или функции myError (если ошибки есть) function getData(res){ fs.readFile(‘data.json’, function(err, data){ if(err){ myError(err, res); }else{ getTemp(JSON.parse(data.toString()), res) } }); } // функция getTemp получив данные загружает шаблон и передает управление кодом функции formatHtml. function getTemp(titles, res){ fs.readFile(‘temp.html’, function(err, data){ if(err){ myError(err, res); }else{ formatHtml(titles, data.toString(), res); } }); } // функция formatHtml получив данные и шаблон, передает ответ клиенту. function formatHtml(titles, tmp, res){ // в файле шаблона находим символы $$, заменяем их на данные из JSON-файла. var htmldata = tmp.replace(‘$$’, titles); res.writeHead(200, {‘Content-Type’: ‘text/html’}); res.end(htmldata); } function myError(err, res){ console.log(err); res.end(‘server error’) }
К листингу прилагается два файла: файл шаблона temp.html и файл с данными в JSON-формате data.json. Рассмотрим файл шаблона
// html-код $$ // html-код
Количество вложений также можно уменьшить, избавившись от блоков if/else.
Перепишем код, применив идиому раннего возврата функции.
// вместо блока if/else функции getData(), вставим следующий код if(err) return myError (err, res) getTemp(…); // вместо блока if/else функции getTemp(), вставим следующий код if(err) return myError (err, res) formatHtml(…);