2012-10-12 116 views
5

基本路线是这样的:是有可能在Express.js名路线

app.get('/', function(req, res){ 
    res.send('hello world'); 
}); 

是否有可能来命名路线和有它在任何模板可用,因此可以这样使用:

app.get('/', name="index", function(req, res){ 
    res.send('hello world'); 
}); 

Go to site <a href="{% url index %}">index page</a>. 

的灵感来自于Django的:)

+0

您可能需要查看几件事:[express-resource](https://github.com/visionmedia/express-resource)以获得一致的命名,并查看机车如何实现[urlFor](http:///locomotivejs.org/guide/datastores.html)。 –

+0

如果您再次遇到此问题,请查看[Shrinkroute](http://npmjs.org/package/shrinkroute)。它被积极维护,并与Express 3一起工作。 – gustavohenke

+0

从我提到的Django ['{%url%}'](https://docs.djangoproject.com/en/dev/ref/templates/builtins/#url)模板标签:) –

回答

9

没有开箱机制是的。但是,您可以像这样模拟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(或任何主要文件),你需要将网址绑定到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); 
}; 

现在,您可以自定义助手(快车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

+1

这一切是什么意思? – chovy

+6

问题是,有了这个,你可以改变你的网址,而无需在你的所有模板中改变字符串。这是不好的代码网址;) – Aleksandrenko

+0

怪异的:谢谢,当我开始写我的应用程序,我会做到这一点的组件:)以方便使用。 我不知道我将如何构建我的应用程序,但是可以制作一些django的应用程序结构。 – Aleksandrenko

1

我有同样的问题,并决定建立一个图书馆来帮助我。

除了不硬编码你的路由,它允许我创建导航组件如面包屑,我可以使用它服务器端与快递或客户端与骨干或任何其他。

https://github.com/hrajchert/express-shared-routes

+0

有趣的:)你如何使用命名的路线在玉?例如,在一个窗体中:'form(action ='???'method ='post'role ='form'class ='form-horizo​​ntal')' – Pathros

+0

我最终创建了一个我自己的... 4年前:D哇时间飞。 https://www.npmjs.com/package/urls – Aleksandrenko

4

我发现快递-反向很好地解决这个问题

https://github.com/dizlexik/express-reverse

它扩充了标准的路由,允许你通过该路由的名称作为第一个参数

app.get('test', '/hello/:x', function(req, res, next) { 
    res.end('hello ' + req.params.x); 
}); 

让您按名称从模板内部构建网址

<a href="<%= url('test', { x: 'world' }) %>">Test</a> 

让你的名字

app.get('/test-redirect', function(req, res, next) { 
    res.redirectToRoute('test', { x: 'world' }); 
}); 
+1

这个问题在于它不工作'express.Router()',所以你不能使用'router.route('/ url')。get ).post()。put()',这相当**方便 –

0

我的东西这个重定向到URL是你在找什么:Named routes

示例代码:

var express = require('express'); 
var app = express(); 

var Router = require('named-routes'); 
var router = new Router(); 
router.extendExpress(app); 
router.registerAppHelpers(app); 

app.get('/admin/user/:id', 'admin.user.edit', function(req, res, next){ 
    // for POST, PUT, DELETE, etc. replace 'get' with 'post', 'put', 'delete', etc. 

    //... implementation 

    // the names can also be accessed here: 
    var url = app.namedRoutes.build('admin.user.edit', {id: 2}); // /admin/user/2 

    // the name of the current route can be found at req.route.name 
}); 

app.listen(3000); 

正如你所看到的您可以将路线命名为admin.user.edit并在您的视图中访问它