- PVSM.RU - https://www.pvsm.ru -
Не смотря на заметные успехи, Node.js [1] все еще остается специализированной технологией, которой преимущественно закрывают узкие места в системах, написанных в другом стеке технологий. Причина такого положения кроется в том, что сама по себе нода не имеет многих библиотек, к которым мы привыкли на других языках и которые обеспечивают быструю разработку именно прикладного ПО. Например, для того, чтобы разделить в коде обработчики разных URL, отдавать статические файлы, организовывать сессии, запускать нескольких потоков, иметь доступа к БД, кешировать данные в памяти, разграничивать права пользователей, иметь логи и ротировать их, создавать сетевое API, рендерить шаблоны, настраивать URL-реврайтинг, обеспечивать быструю доставку событий с сервера на клиенты, для всего этого, и многих других задач, используются отдельные библиотеки (модули). Разные модули написаны разными разработчиками, сложно стыкуются, конфликтуют. В общем, мы решили, весь этот набор обязательного функционала, необходимого практически в каждом веб-приложении, объединить в один сервер приложений и повысить, таким образом, связанность кода, сделать ядро сервера приложений монолитным и более согласованным, чем решения, собранные из отдельных библиотек. Проект Impress [2] уже анонсировался как прототип [3], а сейчас предоставляет весь необходимый арсенал для быстрой разработки приложений, что протестировано на десятке живых проектов. Impress значительно отличается от другой широко распространенной платформы так же, как импрессионизм отличается от экспрессионизма, то есть, производит целостное, хорошо продуманное эстетическое впечатление, в противоположность внезапному выбросу эмоций. Но мы, не вовлекаясь в критику чужого кода, перейдем к демонстрации конструктивных особенностей Impress.
Ну и те возможности, о которых не буду подробно, т.к. уже писал о них [3] и их лучше смотреть на примерах:
Надстройка над драйвером доступа к MySQL:
Так же разработан метаязык на базе синтаксиса JSON, который позволяет удобно и кратко описывать структуры реляционных БД и транслировать потом эти структуры в SQL скрипты. См. примеры в каталоге /node_modules/impress/schemas/ Для трансляции можно использовать такой код:
var schemaCore = require('./schemas/impress.core.schema.js');
var scriptCore = db.schema.mysql.generateScript(schemaCore, true).script;
console.log(scriptCore);
Далее, схемы можно использовать для скафолдинга форм, гридов и вообще пользовательских интерфейсов, но это тема для отдельной публикации.
Лучше всего понимать на примерах, которых в Impress достаточно. Сразу после установки из NPM-репозитория (npm install impress [21]) мы можем развернуть примеры, скопировав их из папки /node_modules/impress/examples/copyContentToProjectFolder в корень проекта. Для запуска желателен MongoDB для хранения сессий (в ближайшее время будут реализованы и другие провайдеры хранения сессий). Но можно запустить примеры и без БД. Если же MongoDB все же есть, то нужно в config.js установить «session.persist» в true, раскомментировать «databases.impress», в том же конфиге, и в секции «plugins.require» раскомментировать модули: «db», «db.mongodb», «impress.security.mongodb». После этого создать необходимые коллекции и индексы запустив: node setup.js и потом запустить сервер приложений: node server.js
Одна из основных задач, для чего разрабатывался Impress — это созданеи серверов приложений как на принципе STATEless (т.е. REST серверов), так и на более интересном принципе STATEful. Нужно напомнить, что REST, это когда между парой запрос/ответ ни на сервере, ни на клиенте, не сохраняется состояние объекта. В противоположность RPC, на котором основаны клиент-серверные приложения, в которых принято создавать модель в клиенте и создавать модель в сервере, связывая их интерфейсы по сети и транслируя между этими моделями события и вызовы. Вот нода позволяет развернуть модель на двух концах провода и синхронизировать через AJAX/JSON вызовы, что конечно более удобно для прикладных приложений. REST пришел в ноду из каменного века тяжеловесных веб серверов (как Apache и IIS), которые каждый раз запускали внешние (по отношению к ним) приложения, передавая им запросы HTTP протокола через CGI. Такое приложение порождает новый процесс, он должен провести инициализацию рабочей среды, т.е. установить соединения с базой, развернуть все свои данные, прочитать себе из файловой системы что-то (если нужно) и т.д. и все это лишь для того, чтобы через несколько мил миллисекунд завершить работу и освободить память, отключиться от базы. До веба я писал на языках, в которых принято STATEful API как RPC (COM, DCOM, Corba...), и для меня концепции REST всегда не хватало. И вот, наконец, после перехода в вероисповедание ноды, мне было счастье. Теперь опять можно разворачивать в памяти данные и они никуда не деваются от запроса к запросу, можно хранить увесистые сессии в оперативной памяти и не делать сериализацию/десериализацию оных при завершении и повторном запуске процессов. И мне было видение, что REST ушел в прошлое вместе с костылями типа viewstate и серверами состояний. Понял я, что STATEful API есть величайшее благо, дарованное Всевышним каждому живому существу, познавшему ноду.
Чтобы сделать новый обработчик API-урла, нужно всего-то:
1. Создаем папку /api/myAPI/getSomething.json/
2. Кладем туда файл post.js и в нем пишем:
module.exports = function(req, res, callback) {
db.impress.collectionName.find({ fieldName: req.post.fieldValue }).toArray(function(err, nodes) {
res.context.data = nodes;
callback();
});
}
3. В каталоге /api/myAPI делаем файл access.js и в нем пишем:
module.exports = {
guests: false, logged: true, http: true, https: true
}
Все готово, для https просто в config.js настройки ставим и в access.js запрещаем http для этой папки. Более того, создавать обработчики можно безе перезапуска сервера, просто создаем еще папку и пишем там код в файле. При первом обращении код попадает в память, при изменении файла на винте код подгружается новый в память и там сидит и ждет вызова.
После установки и разворачивания примеров, можно увидеть такие экраны. На первом — форма регистрации пользователей, она работает при подключенной MongoDB, как и вся функциональность, связанная с аккаунтами и хранимыми сессиями (Create account, Sign In, Sign out).
В левом столбце кнопки, которые запускают примеры, их лучше смотреть со включенным Firebug или другим браузерным инструментом разработчика.
Самый большой пример, это универсальная админпанель для MySQL и MongoDB [22], о которой я уже писал. Вот ее скриншот:
Автор: MarcusAurelius
Источник [23]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/javascript/44009
Ссылки в тексте:
[1] Node.js: http://nodejs.org/
[2] Impress: https://github.com/tshemsedinov/impress
[3] анонсировался как прототип: http://habrahabr.ru/post/182714/
[4] Паттерны JavaScript модулей в Impress для node.js и браузеров: http://habrahabr.ru/post/183188/
[5] async: https://npmjs.org/package/async
[6] cluster: https://npmjs.org/package/cluster
[7] colors: https://npmjs.org/package/colors
[8] mkdirp: https://npmjs.org/package/mkdirp
[9] mongodb: https://npmjs.org/package/mongodb
[10] mysql: https://npmjs.org/package/mysql
[11] memcached: https://npmjs.org/package/memcached
[12] nodemailer: https://npmjs.org/package/nodemailer
[13] geoip-lite: https://npmjs.org/package/geoip-lite
[14] uglify-js: https://npmjs.org/package/uglify-js
[15] multiparty: https://npmjs.org/package/multiparty
[16] iconv-lite: https://npmjs.org/package/iconv-lite
[17] ZeroMQ: http://zeromq.org/
[18] https://github.com/tshemsedinov/impress/wiki/MySQL-Data-Access-Methods: https://github.com/tshemsedinov/impress/wiki/MySQL-Data-Access-Methods
[19] https://github.com/tshemsedinov/impress/wiki/MySQL-Introspection-Methods: https://github.com/tshemsedinov/impress/wiki/MySQL-Introspection-Methods
[20] https://github.com/tshemsedinov/impress/wiki/MySQL-Query-Generator-Methods: https://github.com/tshemsedinov/impress/wiki/MySQL-Query-Generator-Methods
[21] npm install impress: https://npmjs.org/package/impress
[22] MySQL и MongoDB: http://habrahabr.ru/post/192302/
[23] Источник: http://habrahabr.ru/post/194250/
Нажмите здесь для печати.