【问题标题】:URL Generation for Routes in ExpressExpress 中路由的 URL 生成
【发布时间】:2012-02-03 23:59:47
【问题描述】:

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

我尝试寻找一些 Connect 中间件来为我的任务服务,我确实找到了 Barista、Escort、Sherpa 等,但查看他们的 GitHub 页面,所有这些似乎都已死且不活跃。所以,我不想因为明显的原因而不再维护的东西。

我在这里主要担心的是项目可能会变得非常大,并且每当业务和/或审美要求发生变化时更新每个页面中的 URL 会很痛苦。

我在文档/测试中没有看到什么?如果没有,那么如何扩展 Express 中的路由框架以生成 URL 并使这个包装器在我的视图和控制器功能中可用?

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

【问题讨论】:

  • 当然 express 可以做很多事情,但是有很多框架构建在 express 之上,甚至只是在 node.js 本身上。我个人最喜欢的是 Hapi.js。还有帆。或者如果您足够疯狂,则只是纯节点。我已经在生产环境中使用了这两种方法。在 hapi 的情况下,您真正​​可能正在寻找的是 url 参数。但您不限于在节点中有大量​​框架可供选择。

标签: node.js express


【解决方案1】:

或者坚持使用快递并使用包裹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})

【讨论】:

  • 2019 年注意事项:named-routes 自 2016 年以来未维护。
【解决方案2】:

你可以试试Locomotive,它是基于 Express 构建的。

它的作用远不止路由生成。来自文档:“Locomotive 带来了额外的基于 MVC 的结构,用于构建更大的应用程序,同时利用 Express 和 Connect 中间件的强大功能。”

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

【讨论】:

  • 2019年注意事项:机车自2014年以来未更新。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多