Фреймворки в Node.js: Express
Установка
Устанавливаем менеджер пакетов kiwi (всё равно потом пригодится):
UPD: не пригодится. Разработка Kiwi прекращена, основным менеджером пакетов для Node.js теперь является npm
wget http://github.com/visionmedia/kiwi/tarball/0.2.2
Распаковываем и ставим:
tar -xvzf visionmedia-kiwi-1d88c30.tar.gz
cd visionmedia-kiwi-1d88c30
make install
Для работы kiwi понадобится curl. Если он ещё не установлен, ставим:
apt-get install curl
Теперь ставим сам express:
kiwi -v install express
Kiwi говорит что последняя версия – 0.8.0, и ставит её.
Отлично, Express готов к работе.
Hello, world!
В оригинальных примерах к Express принят стиль кода, при котором точки с запятой в конце строк опускаются. Скорее всего этот стиль пришёл сюда из Ruby вместе с архитектурой фреймворка
В моих примерах точки с запятой всё таки будут присутствовать — я предпочитаю такой стиль.
Раз мы поставили express через kiwi, подключаем тоже через него:
var kiwi = require('kiwi');
kiwi.require('express');
get('/', function(){
this.redirect('/hello/world');
});
get('/hello/world', function(){
return 'Hello World';
});
run();
Это простой пример с expressjs.com. При выполнении этого скрипта сайт запустится на адресе http://localhost:3000 (имеет смысл перенаправить nginx, если он используется). Порт и адрес можно менять, передавая соответствующие параметры методу run:
run(8000, '192.168.175.128');
Итак, в реальном приложении нам надо в первую очередь указать корневую папку нашего сайта. Как и вся настройка express, делается это функцией set(). Чтобы использовать текущую директорию, из которой запущен скрипт, можно передать параметром __dirname:
configure(function(){
set('root', __dirname)
})
get('/', function(){
this.redirect('/hello/world')
})
get('/hello/world', function(){
this.render('title.haml.html', {
layout: false,
locals: {
title: 'Hello World'
}
})
})
run()
Здесь мы уже используем вьюшку в формате HAML. Любой запрос к корню сайта будет перенаправлен на /hello/world, запрос к /hello/world будет темизирован с помощью HAML-шаблона title. Путь к вьюшкам можно указать отдельно с помощью set('views', __dirname + '/templates'), по умолчанию он установлен в set('root') + '/views'.
Кстати, title.haml.html это не имя файла, а команда для шаблонизатора. Title это имя вьюшки, haml — используемый шаблонизатор и html — тип вывода.
Код любого сайта на Express выглядит примерно так же. Сначала вызов конфигуратора, потом настройка роутеров, и наконец запуск приложения. Основной файл принято называть app.js.
Плагины
Большая часть функционала Express содержится в плагинах. Views, который мы использовали только что — тоже плагин, добавляющий к объекту request метод render. Views поддерживает рендеринг страниц и отдельных элементов, а также использование разных шаблонизаторов. Т.е. если Вы например привыкли к Mu, Вам не придётся переучиваться
Другие полезные плагины:
- Необходимые плагины
- Views — шаблонизаторы
- Redirect — поддержка редиректов
- BodyDecoder — декодирование multipart-запросов
- Cache — кеширование
- Необязательные плагины
- Logger — ведение логов; поддерживается несколько видов логов (в том числе Apache Combined)
- ContentLength — автоматическая отправка заголовков Content-length с ответом
- Hooks — позволяет выполнять пользовательский код перед и после обработки запроса (
before()иafter()) - Cookie — низкоуровневая работа с куками
- Session — поддержка сессий (поддерживаются разные хранилища данных, по умолчанию — общая память)
- Flash — очередь оповещений
Чтобы использовать необязательные плагины, их необходимо подключить функцией require() и передать функции use(), после чего соответствующие методы будут доступны для каждого запроса:
use(require('express/plugins/logger').Logger);
Если для каждого запроса должны быть созданы какие-либо объекты, они будут созданы автоматически. Можно также подключить все плагины, и использовать только нужные:
require('express/plugins');
use(Logger);
Пример использования плагинов Cookie и Session:
use(Cookie);
use(Session, { expires: (12).hours , reapInterval: (2).minutes });
get('/user/:user', function(user){
// Properties of Request#session are automatically committed before responding
this.session.user = user;
return ':)';
});
get('/who', function(){
// Properties of Request#session are automatically fetched before the request is handled
return 'You are ' + this.session.user;
});
Обратите внимание как в роутере используются пути с параметрами. При переходе на /user/Grinch аргумент пути будет передан в обработчик запроса, и сохранён в сессии. При вызове /who имя пользователя будет получено из сессии.
Заключение
Общее впечатление от фреймворка — очень хорошее. Логичная и простая структура, неплохо документированные возможности, расширяемость — очень хороший задел на будущее. Я планирую и дальше следить за развитием проекта и возможно использовать его в тех случаях когда функционала простых роутеров вроде nerve уже не хватает.
Как нибудь позже ещё рассмотрю фреймворк на основе Django: djangode (и может быть nodemachine – порт WebMachine из Erlang), очень интересно сравнить их с Express.
Фреймворки в Node.js
- Express
- Djangode
- Nodemachine
- Fab
- Geddy
Ссылки по теме
- Официальный сайт Express
- Официальная Google-группа
- Express на GitHub
- Документация по плагинам на wiki проекта
P.S. Обзор фреймворка сделан вне очереди по просьбе твиттер-пользователя @itrelease.

Отличный обзор, спасибо. Было бы интересно еще почитать про интеграцию с MongoDB и сравнить, к примеру, с CouchDB
Вот здесь описано создание блога на MongoDB + Express. К Couch я ещё вернусь пожалуй, когда буду изучать map-reduce функции, а т.к. мой блогодвижок Cassiterite сейчас как раз на Couch, можно будет попробовать что нибудь написать.
Эмммм, роутер в примере надо писать наверное так:
get(‘/user/:user’, function(user){})
тогда получится переход на /user/Grinch
Да, действительно, спасибо
Как то я потерял этот кусочек.
Отличный обзор! Взял с гит-хаба, но нигде не могу найти плагины.
Не подскажите, где они лежат? что-то ни как не могу разобраться.
Спасибо.
Спасибо ) Плагины лежат там же на github: вот и вот , например. Express теперь сам по себе плагин к Connect, соответственно плагины для Connect тоже должны работать.
Оу.. Вот тут ошибка в списке “Другие полезные плагины -> Необязательные плагины”, два раза повторяется плагин Cookie.
Да, действительно
Второй плагин это Session. Исправил, спасибо.
Хорошая статья, спасибо,
только вот не хватает в обзорах фреймворков маленьких пример генерации динамических страниц. К примеру: содержимое html-шаблона, какие-то простенькие вставки…
По моему – это самое важное.
Да, шаблонизацию я хотел описывать отдельно. По крайней мере по Jade и EJS будут статьи. В статье по Mu были примеры вставки данных в шаблон.
http://express-js.ru – русскоязычная документация к express
Reblogged this on oleg40a.