четверг, 29 мая 2014 г.

Роутинг в express с помощью urouter

Стандартный роутинг express мне не очень понравился, поскольку имеет ряд недостатков:
  • неудобное описание именованных роутов (в express именованные роуты описываются с помощью объектов, что лично мне показалось очень неудобным);
  • отсутствие бриджей-префиксов (чтобы не писать в начале десяти роутов /admin);
  • необходимость создавать переменные, в которые надо помещать все бриджи роутов;
Именно поэтому я решил, что надо сделать свой модуль для работы с роутами в express. При этом, желательно оставить полную совместимость в работе со стандартным роутингом. Поскольку построение карты роутов - задача, выполняемая лишь при старте приложения, то мой модуль должен просто транслировать из удобного мне описания роутов в описание, предусмотренное средствами express. 

До этого я работал с Mojolicious и мне очень понравилось то, как в нем организован роутинг. Именно поэтому я решил взять в качестве образца роутинг Mojolicious.

В итоге получился подобный синтаксис:

var Router = require('urouter'),

(Router(app, function($) {
    // check session and put user into req if user authorized
    $.bridge(user.bridge, function($) {

        $.get('/sign_up').to(user.sign_up).setName('signUp');
        $.post('/sign_up').to(user.sign_up);
        $.get('/sign_in').to(user.sign_in).setName('signIn');

        // if user authorized do next
        $.bridge(user.bridgeAuthUser, function($) {

            $.get('/charts').to(user.charts);
            $.get('/dash').to(user.dash).setName('dash');
            $.get('/users').to(user.list);

            // all this routes begin with '/user'
            $.bridge('/user', function($) {
                $.post('/create').to(user.create);
                $.post('/edit').to(user.edit);
            });
        });
    });
})();


Как видно, синтаксис получился довольно простым и понятным. При этом, мы легко можем видеть за какими бриджами находится роут по его вложенности.  Также мы можем легко перемещать роут между разными бриджами просто переместив его на уровень вложенности (коллбэк) выше или ниже. Нам не нужно отдельно описывать бриджи для роутов, код получается значительно более компактным и простым для восприятия.

Установка: npm install urouter
Исходный код на github: https://github.com/alexahdp/urouter
Страница в npm: https://www.npmjs.org/package/urouter