Express中路由的URL生成

18

我正在考虑在我的下一个node.js项目中使用Express框架。然而,对我来说一个障碍是没有像大多数基于Sinatra之外的框架(例如Django、Flask、Rails等)那样的路由URL生成。

我尝试寻找一些Connect中间件来完成我的任务,我确实找到了Barista、Escort、Sherpa等,但是看了它们的GitHub页面后,它们似乎都已经死亡和不活跃了。因此,显而易见的原因是我不想选择不再维护的东西。

我的主要担忧是项目可能会变得非常庞大,当业务和/或美学要求改变时,在每个页面中更新URL将是一件痛苦的事情。

文档/测试中有我没看到的东西吗?如果没有,那么我该如何扩展Express的路由框架以进行URL生成,并使此包装器在我的视图以及控制器函数中可用?

更新:(2012年3月22日)我发现了这个页面:https://github.com/clyfe/tweet_express/wiki/TODO它指定了一些可以进行URL生成的路由器,我偶然发现了可以与Express接口的Escort路由器。


当然,Express 可以做很多事情,但是还有很多基于 Express 或者仅仅基于 Node.js 本身的框架。我个人最喜欢的是 Hapi.js。还有 Sails。或者如果你足够疯狂,可以使用纯 Node。我在生产环境中使用过这两种方法。在使用 Hapi 的情况下,您真正需要的可能是 URL 参数。但是您并不受限制,Node 中有大量可供选择的框架。 - Chacliff
3个回答

15

或者继续使用express并使用reversable-router包。

来自自述文件的示例:

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})

1
注意:截至2019年,named-routes自2016年以来没有得到维护。 - Hendy Irawan

10
你可以尝试使用基于Express构建的Locomotive
它不仅仅提供路由生成功能。从文档中可以看到:“Locomotive带来了额外的基于MVC的结构,用于架构更大型的应用程序,同时利用了Express和Connect中间件的强大功能。” Locomotive的路由生成器会自动生成可用于控制器和视图的助手函数。

3
注意:在2019年,Locomotive自2014年以来没有更新。 - Hendy Irawan

0

来自@freakish的答案

目前还没有现成的机制可以实现这个功能。但是你可以像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;
        }
    };
};

你可以轻松地在模板中使用它。现在的问题是,它没有像Django那样提供漂亮的URL创建机制(其中你可以传递附加参数到url)。另一方面,你可以修改url函数并扩展它。我不想在这里详细介绍所有细节,但以下是一个示例,说明如何使用正则表达式(你应该能够将这些想法组合在一起):

Express JS反向URL路由(Django风格)

请注意,我发布了这个问题,所以我也曾经遇到过同样的问题。 :D


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接