基本路线是这样的:
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 :(得分: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或其他任何东西。
答案 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)
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'}))