15

基本路线是这样的:

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

4

6 回答 6

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(或任何主文件)中,您需要将 url 绑定到 Express。例如像这样:

应用程序.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

于 2012-10-12T08:19:51.207 回答
4

我发现 express-reverse 可以很好地解决这个问题

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

它增强了标准路由,允许您将路由的名称作为第一个参数传递

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

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

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

让您按名称重定向到 url

app.get('/test-redirect', function(req, res, next) {
    res.redirectToRoute('test', { x: 'world' });
});
于 2015-04-04T10:44:37.530 回答
1

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

function updateToDo(req, res, next) { /*do router stuff*/};
router.put('/', updateToDo);
于 2020-04-19T20:06:45.930 回答
0

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

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

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

于 2013-10-08T20:13:57.060 回答
0

我觉得这就是你要找的东西:命名路线

示例代码:

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并在您的视图中访问它

于 2016-08-26T00:04:20.533 回答
0

请检查这个要点

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'}))
于 2019-05-19T11:30:45.187 回答