Skip to content

Фреймворки в Node.js: Nodemachine

02/04/2010

Nodemachine — небольшой фреймворк (он состоит всего из одного файла), порт WebMachine из сервера MochiWeb, изначально написанного на Эрланге. Его страница на Github сообщает что фреймворк был обновлён в конце февраля чтобы работать с Node.js версии 0.1.29. Это уже не очень хорошо — с тех пор произошли изменения в API, не факт что фреймворк теперь вообще запустится. Но после фреймворка в стиле Ruby и фреймворка в стиле Python посмотреть на nodemachine всё равно интересно.

Установка

Скачиваем с помощью git:

    git clone git://github.com/tautologistics/nodemachine.git
    

И сразу запускаем тесты, чтобы проверить работоспособность с node 0.1.33:

    node runtests.js
    

Если не считать сообщения о том что process.mixin скоро будет выкинут из ядра, тесты отрабатывают полностью. Запускаем файл example-simple.js (изменяя по традиции порт с 8080 на 8000), видим страницу с ошибкой браузера, говорящей о том что документ сформирован неправильно.

Использование

Сразу к сути — это не то, что обычно подразумевается под фреймворком. Всё что делает Nodemachine — проходит по определённому графу для каждого запроса и отправляет соответствующий ответ (беря контент из т.н. функции ресурса — по сути, коллбека для определённого состояния на графе). Код на первый взгляд выглядит просто ужасно. Вот примеры имён функций:

function v3i7 (context) {
    HandleDecision(context, (context.req.method == "PUT"), true, v3i4, v3k7);
}

function v3i4 (context) {
    context.app.movedPermanently(context, v3i4_callback);
}
function v3i4_callback (context, result) {
    if (result) {
        context.res.setHeader("Location", result);
        HandleDecision(context, true, true, 301, 301);
    } else
        HandleDecision(context, true, true, v3p3, v3p3);
}

function v3k7 (context) {
    context.app.previouslyExisted(context, v3k7_callback);
}
function v3k7_callback (context, result) {
    HandleDecision(context, result, true, v3k5, v3l7);
}
    

Имена обозначают переходы на графе решений — например v3k7 это решение в точке K7 («Resource previously existed?»). Положительный ответ приводит нас на K5, отрицательный — на L7 . Разобраться в такой штуке будет непросто 🙂

В общем и целом, nodemachine реализует для нас неплохой фундамент для строительства RESTful-сервисов, полностью следующих спецификации HTTP. Мы можем навешивать обработчики на отдачу контента с помощью GET, сохранение с помощью PUT и POST, удаление через DELETE и многое другое. Nodemachine будет обрабатывать ситуации вроде «405 Method Not Allowed» или «413 Request entity too large». Остальное нам придётся делать самостоятельно.

Вначале попробуем понять что же мешает примеру отдавать контент. Копание в коде и внимательный взгляд на страницу показывают, что контент всё таки приходит, но в виде текстовой строки: «This is the content». При этом mime-тип отправляется application/xml.

Стоит нам открыть example-simple.js и придать контенту на 36 строке HTML-подобный вид (с нужными тегами), как мы увидим нужную страницу в браузере (хотя это и немного не то для чего создан nodemachine).

Заключение

Итак, NodeMachine предназначен для создания RESTful-сервисов. Он поддерживает, судя по всему, почти всё многообразие методов и ответов протокола HTTP, но кроме этого не предоставляет вообще ничего. Мне, честно говоря, не идёт в голову никакой сервис, который я мог бы быстро изобразить с помощью Nodemachine. К тому же, проект похоже сейчас не развивается. Поэтому, думаю, на этом пока закончим.

Фреймворки в Node.js

2 комментария
  1. Граф на битбукете очень впечатлил 🙂

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: