Создание URL-адресов для маршрутов в Express

Я рассматриваю использование Express Framework в следующем проекте node.js. Тем не менее, камнем преткновения для меня является отсутствие генерации URL-адресов для маршрутов, как в большинстве других инфраструктур, основанных не на синатрах, примеры - Django, Flask, Rails и т.д.

Я попробовал найти промежуточное ПО Connect для выполнения своей задачи, и я нашел Barista, Escort, Sherpa и подобных, но, глядя на их страницы GitHub, все выглядят мертвыми и активными. Таким образом, я не хочу идти за тем, что не поддерживается по очевидным причинам.

Моя главная забота здесь в том, что проект может стать действительно большим, и это будет больно обновлять URL-адреса на каждой странице, когда изменяются бизнес-и/или эстетические требования.

Есть ли что-то, что я не видел в документах/тестах? Если нет, то как мне расширить структуру маршрутизации в Express для создания URL-адресов и сделать эту оболочку доступной для моих представлений, а также для функций контроллера?

UPDATE: (22/3/2012) Я нашел эту страницу: https://github.com/clyfe/tweet_express/wiki/TODO, в которой указаны некоторые маршрутизаторы, которые генерируют URL-адреса и наткнулся на эскорт-маршрутизатор, который также может взаимодействовать с выражением.

Ответ 1

Вы можете попробовать Locomotive, который построен на Express.

Это намного больше, чем генерация маршрута. Из документов: "Локомотив приносит дополнительную структуру на основе MVC для архивирования больших приложений, одновременно используя мощь промежуточного программного обеспечения Express и Connect".

Локомотивный маршрутизатор генерирует помощники, которые автоматически доступны для контроллеров и представлений.

Ответ 2

Или придерживайтесь выражения и используйте пакет reversable-router.

Пример из readme:

app.get('/admin/user/:id', 'admin.user.edit', function(req, res, next){
    //...
});

//.. and a helper in the view files:
url('admin.user.edit', {id: 2})

Ответ 3

От @странного ответа:

Для этого нет готового механизма. Однако вы можете имитировать стиль Django следующим образом: определить файл urls.js который будет содержать массив URL-адресов. Сначала начните с:

myviews.js

exports.Index = function( req, res, next ) {
    res.send( "hello world!" );
};

urls.js

var MyViews = require( "mywviews.js" );

module.exports = [
    { name : "index", pattern : "/", view : MyViews.Index }
]

Теперь в app.js (или любом другом главном файле) вам нужно привязать URL к Express. Например, вот так:

app.js

var urls = require( "urls.js" );

for ( var i = 0, l = urls.length; i < l; i++ ) {
    var url = urls[ i ];
    app.all( url.pattern, url.view );
};

Теперь вы можете определить пользовательский помощник (стиль Express 3.0):

var urls = require( "urls.js" ), l = urls.length;
app.locals.url = function( name ) {
    for ( var i = 0; i < l; i++ ) {
        var url = urls[ i ];
        if ( url.name === name ) {
            return url.pattern;
        }
    };
};

и вы можете легко использовать его в своем шаблоне. Теперь проблема в том, что он не дает вам причудливый механизм создания URL, как в Django (где вы можете передавать дополнительные параметры в url). С другой стороны, вы можете изменить функцию url и расширить ее. Я не хочу вдаваться в подробности, но вот пример использования регулярных выражений (вы должны быть в состоянии объединить их с идеями вместе):

Экспресс-маршрут обратного URL JS (стиль Django)

Обратите внимание, что я разместил вопрос, поэтому у меня была такая же проблема некоторое время назад. : D