是否可以在Express.js中命名路由

时间:2012-10-12 08:01:33

标签: node.js express

基本路线是这样的:

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

6 个答案:

答案 0 :(得分:13)

没有开箱即用的机制。但是你可以像这样模仿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 );
};

现在您可以定义自定义帮助程序(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

答案 1 :(得分: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' });
});

答案 2 :(得分:1)

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

除了不对您的路线进行硬编码外,它还允许我构建像面包屑这样的导航组件,我可以使用服务器端,快速或客户端使用Backbone或其他任何东西。

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

答案 3 :(得分:1)

我在这里看不到的另一个选项是仅使用函数名称提取出route函数。如果您只想编写自我记录代码。

function updateToDo(req, res, next) { /*do router stuff*/};
router.put('/', updateToDo);

答案 4 :(得分:0)

我认为这就是你要找的东西: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并在您的视图中访问

答案 5 :(得分:0)

Check this Gist please

var env="http://localhost:3000/"
var route='users/:id/profile/'
var routes=[
  {
    'name':'profile',
    'path':'users/:id/:profile/'

  }
]


function RouteName(route,arg){
  let targetRoute = routes.find(e=>e.name==route).path
  for(var key in arg){

  targetRoute=targetRoute.replace(`:${key}`,arg[key])
  //console.log(targetRoute)

}
return targetRoute

}

console.log(env+RouteName('profile',{'id':3,'profile':'loaiabdalslam'}))