Skip to content

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

31/03/2010

Фото: Roadsidepictures

Express — один из самых развитых фреймворков для Node.js на данный момент. Он во многом основан на Sinatra, веб-фреймворке для Ruby. Полностью все его возможности мы попробовать не успеем, но по основным сейчас пройдёмся.

Установка

Устанавливаем менеджер пакетов 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

Ссылки по теме

P.S. Обзор фреймворка сделан вне очереди по просьбе твиттер-пользователя @itrelease.

13 комментариев
  1. Отличный обзор, спасибо. Было бы интересно еще почитать про интеграцию с MongoDB и сравнить, к примеру, с CouchDB

    • Вот здесь описано создание блога на MongoDB + Express. К Couch я ещё вернусь пожалуй, когда буду изучать map-reduce функции, а т.к. мой блогодвижок Cassiterite сейчас как раз на Couch, можно будет попробовать что нибудь написать.

  2. Эмммм, роутер в примере надо писать наверное так:
    get(‘/user/:user’, function(user){})
    тогда получится переход на /user/Grinch

  3. pwrfail permalink

    Отличный обзор! Взял с гит-хаба, но нигде не могу найти плагины.
    Не подскажите, где они лежат? что-то ни как не могу разобраться.
    Спасибо.

    • Спасибо ) Плагины лежат там же на github: вот и вот , например. Express теперь сам по себе плагин к Connect, соответственно плагины для Connect тоже должны работать.

  4. Sukazavr permalink

    Оу.. Вот тут ошибка в списке «Другие полезные плагины -> Необязательные плагины», два раза повторяется плагин Cookie.

  5. Хорошая статья, спасибо,

    только вот не хватает в обзорах фреймворков маленьких пример генерации динамических страниц. К примеру: содержимое html-шаблона, какие-то простенькие вставки…
    По моему — это самое важное.

    • Да, шаблонизацию я хотел описывать отдельно. По крайней мере по Jade и EJS будут статьи. В статье по Mu были примеры вставки данных в шаблон.

  6. jsmarkus permalink

    http://express-js.ru — русскоязычная документация к express

Trackbacks & Pingbacks

  1. Хранилища данных в Node.js: Redis « nodeJS

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

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

Логотип WordPress.com

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

Фотография Twitter

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

Фотография Facebook

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

Google+ photo

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

Connecting to %s

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