有没有可能在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 🙂
对此没有开箱的机制。 然而,你可以像这样模仿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创build机制。 另一方面你可以修改url
函数并扩展它。 我不想在这里详述所有的细节,但是这里是一个如何使用正则expression式的例子(你应该能够把它们结合起来):
Express JS反向URL路由(Django风格)
请注意,我发布了这个问题,所以前段时间我也有同样的问题。 :d
我发现快速反向很好地解决这个问题
https://github.com/dizlexik/express-reverse
它增加了标准路由,允许您将路由名称作为第一个parameter passing
app.get('test', '/hello/:x', function(req, res, next) { res.end('hello ' + req.params.x); });
让您按名称从模板内部构buildurl
<a href="<%= url('test', { x: 'world' }) %>">Test</a>
让您通过名称redirect到一个url
app.get('/test-redirect', function(req, res, next) { res.redirectToRoute('test', { x: 'world' }); });
我有同样的问题,并决定build立一个图书馆来帮助我。
除了不硬编码你的路由,它允许我build立导航组件像面包屑,我可以使用它的服务器端快递或客户端与骨干或任何。
我这是你正在寻找的东西: 命名的路线
示例代码:
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
并在您的视图中访问它