Express中路由的URL生成

时间:2012-01-06 07:30:39

标签: node.js express

我正在考虑在我的下一个node.js项目中使用Express框架。然而,对我来说,一个绊脚石是没有像大多数其他非基于Sinatra的框架那样的路由生成,例如Django,Flask,Rails等。

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

我主要担心的是项目可能会变得非常大,每当商业和/或美学要求发生变化时,更新每个页面中的URL都会很麻烦。

在docs / tests中我有没有看到的东西?如果没有,那么如何在Express中扩展路由框架以进行URL生成,并在我的视图和控制器函数中使这个包装器可用?

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

3 个答案:

答案 0 :(得分:14)

或坚持使用快递并使用包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 :(得分:10)

您可以尝试使用Express构建的Locomotive

它比路线生成做得更多。来自文档:“机车带来了额外的基于MVC的结构,用于架构更大的应用程序,同时利用Express和Connect中间件的强大功能。”

Locomotive's router generates helpers可自动提供给控制器和视图。

答案 2 :(得分:0)

From @freakish's answer

没有开箱即用的机制。但是,您可以模仿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 reverse URL route (Django style)

请注意,我发布了问题,所以前段时间我遇到了同样的问题。 :D