Этот пост в каком-то смысле продолжение поста про простейший NodeJS сервер, принимающий JSON объекты. Помимо того, что сервер может принимать данные извне (в данном случае, с помощью POST-запроса и JSON), хорошо бы чтобы он умел выдавать пользователю web-страницу с имеющимися данными. В принципе, в случае с одной страницей можно было бы вручную дописать сервер из предыдущего поста, но я решил использовать фреймворк Express, который сэкномит время на написание кода, а в дальнейшем позволит легко масштабировать сервер. Более того, Express имеет встроенные средства для генерации HTML кода из шаблонов страниц (я буду использовать EJS), и много других вещей, которые тоже, вполне возможно, пригодятся в дальнейшем.
Вот и весь код нашего сервера. Код достаточно подробно описан в комментариях, так что остановлюсь дополнительно на структуре каталогов, которую я использую.
Каталог views содержит шаблоны для генерации HTML-страниц (в нашем примере там только один шаблон).
Файл app.js мы уже рассмотрели, рассмотрим остальные файлы.
Помимо использования данных из Javascript-кода сервера в шаблоне также есть ссылка на CSS-файл colordemo.css. Приведу и его код.
Ну и осталось разобраться с файлом package.json, установкой и запуском сервера.
Вообще в этом файле помимо зависимостей можно разместить много другой полезной информации (подробнее об этом можно прочитать здесь), но для данного простого примера в этом нет необходимости. Я указал для пакета express минимальную версию 4.x, так как начиная с этих версий из него много чего выкинули в отдеьные пакеты (тот же body-parser).
Итак, чтобы установить все необходимы пакеты достаточно в корневом каталоге нашего мервера выполнить команду:
Затем можно запустить сервер командой:
Теперь наш сервер работает и принимает запросы через порт 3000. Можно открывать бразуер, вводить адрес http://localhost:3000/ и наслаждаться следующей картинкой:
Выполнить POST-запрос можно, как и в предыдущем посте с помощью утилиты curl, например:
Если после этого обновить страницу в браузере, то страница должна поменяться:
Код сервера
Весь основной код сервера будет расположен в одном Javascript файле, находящемся в корневом каталоге. Назовем его app.js. Вот его содержимое://Подключаем необходимые модули
var express = require('express'); // express - выполняет обработку запросов извне
var http = require('http'); // http - предоставляет http сервер, который принимает
// запросы извне и передавает их на обработку в
// приложение Express
var path = require('path'); //path - инструменты для работы с файловой системой
var bodyParser = require('body-parser'); // body-parser - парсит JSON
//Создаем приложение Express
var app = express();
//Минимальная настройка сервера
app.set('port', 3000); // Выставляем порт, который будет "слушать" сервер
app.set('views', path.join(__dirname, 'views')); // Указываем путь к EJS шаблонам
// HTML страниц
app.set('view engine', 'ejs'); // Устанавливаем EJS в качестве генератора HTML страниц
app.use(express.static(path.join(__dirname, 'public'))); // Указываем путь к статичным ресурсам
// (В данном примере - к CSS файлу)
app.use(bodyParser.json()) // Устанавливаем JSON-парсер в качестве парсера запросов
// Переменная, в которой хранится JSON данные из последнего POST-запроса
var lastJson =
{
color: "green",
show_text: true
};
// Настраиваем обработчик GET-запроса для пути "/". В обработчике просто генерируем из
// EJS-шаблона index.ejs (который находится в папке views) HTML страницу используя данные
// из переменной lastJson и отдаем ее обратно.
app.get('/', function (req, res) {
res.render('index', lastJson);
});
// Настраиваем обработчик POST-запроса для пути "/". В обработчике запоминаем тело запроса (JSON)
// в переменную lastJson и отправляем клиенту HTML-код 200 (ОК).
app.post('/', function (req, res) {
console.log("Got JSON:");
console.log(JSON.stringify(req.body));
lastJson = req.body;
res.sendStatus(200);
});
// Создаем HTTP-сервер и в качестве обработчика запросов назначаем ему созданное ранее приложение Express.
http.createServer(app).listen(app.get('port'), function(){
console.log('Express server listening on port ' + app.get('port'));
});
Дерево каталогов
Дерево каталогов у меня выглядит вот так (жирным выделены каталоги):- demo_server
- public
- images
- javascripts
- stylesheets
- demoserver.css
- views
- index.ejs
- app.js
- package.json
Каталог views содержит шаблоны для генерации HTML-страниц (в нашем примере там только один шаблон).
Файл app.js мы уже рассмотрели, рассмотрим остальные файлы.
Шаблон HTML-страницы
В коде сервера при генерации HTML-страницы из шаблоны мы передавали в шаблон объект JSON. EJS позволяет обращаться к переданным данным прямо из HTML кода. Вот так выглядит мой шаблон:<!DOCTYPE html>
<html>
<head>
<title>Demo Server</title>
<link rel='stylesheet' href='/stylesheets/colordemo.css' />
</head>
<body>
<h1>Demo Server</h1>
<div id="color_demo" style="background-color:<%= color %>;">
<%if ( show_text === true )
{%>
Color is <%= color %>
<%}%>
</div>
</body>
CSS
div#color_demo {
width: 200px;
height: 100px;
margin: 0px;
padding: 0px;
text-align: center;
display: table-cell;
vertical-align:middle;
}
Установка и запуск сервера
В файле package.json хранится информация о необходимых для работы сервера пакетах. Этот файл нужен установщику пакетов npm (его самого нужно сначала установить). Вот содержимое файла:{
"name" : "DemoServer",
"version" : "0.0.1",
"dependencies" : {
"express" : ">=4.x",
"ejs": "*",
"body-parser": "*"
}
}
Итак, чтобы установить все необходимы пакеты достаточно в корневом каталоге нашего мервера выполнить команду:
npm install
nodejs app.js
curl -H "Content-Type: application/json" -X POST -d '{"color":"red","show_text":false}' 127.0.0.1:3000
В итоге мы получили работающий легко расширяемый WEB-сервер.


Комментариев нет :
Отправить комментарий