2012-10-12 85 views
5

ruta básica es la siguiente:es posible rutas de nombre en Express.js

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

¿Es posible nombrar esa ruta y tenerlo disponible en cualquier plantilla para que pueda ser utilizado de esta manera:

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

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

la inspiración viene de Django :)

+0

Un par de cosas que puede consultar: [express-resource] (https://github.com/visionmedia/express-resource) para nombres consistentes, y compruebe cómo la locomotora implementa [urlFor] (http://locomotivejs.org/guide/datastores.html). –

+0

Si alguna vez vuelve a este problema, eche un vistazo a [Shrinkroute] (http://npmjs.org/package/shrinkroute). Se mantiene activamente y funciona con Express 3. – gustavohenke

+0

+1 de mí por mencionar a Django ['{% url%}'] (https://docs.djangoproject.com/en/dev/ref/templates/builtins/#url) etiqueta de plantilla :) –

Respuesta

9

no hay fuera de la caja de mecanismo para eso. Sin embargo, puede imitar el estilo de Django así: defina el archivo urls.js que contendrá una matriz de URL. En primer lugar comenzar con:

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 } 
] 

Ahora en app.js (o lo que sea el archivo principal es) que necesita para enlace urls a Express. Por ejemplo así:

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); 
}; 

Ahora puede definir encargo ayudante (estilo 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; 
     } 
    }; 
}; 

y se puede utilizar fácilmente en su plantilla. Ahora el problema es que no le da un mecanismo de creación de URL como en Django (donde puede pasar parámetros adicionales al url). Por otro lado, puede modificar la función url y ampliarla. Yo no quiero entrar en todos los detalles aquí, pero aquí es un ejemplo de cómo utilizar expresiones regulares (usted debe ser capaz de combinar éstos con las ideas juntos):

Express JS reverse URL route (Django style)

Tenga en cuenta que he publicado la pregunta, así que tuve el mismo problema hace algún tiempo. : D

+1

¿Cuál es el objetivo de todo esto? – chovy

+6

El punto es que con esto puedes cambiar tus URL sin cambiar cadenas en todas tus plantillas. Es malo para las URL de código difícil;) – Aleksandrenko

+0

monstruoso: gracias, cuando empiece a escribir mi aplicación, incluiré esto en un componente :) para un uso más fácil. No estoy seguro de cómo estructuraré mi aplicación, pero es posible hacer algo con la estructura de la aplicación django. – Aleksandrenko

1

Tuve el mismo problema y decidí hacer una biblioteca para ayudarme.

Además de no codificar sus rutas en forma rígida, me permite construir componentes de navegación como migas de pan y puedo usarlo en el lado del servidor con Express o con Backbone o lo que sea.

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

+0

Interesante :) ¿Cómo se utilizan las rutas nombradas en jade? Por ejemplo, en una forma: 'form (action = '???' method = 'post' role = 'form' class = 'form-horizontal')' – Pathros

+0

Termino creando uno de los míos ... 4 años Hace: D wow tiempo volar. https://www.npmjs.com/package/urls – Aleksandrenko

4

He encontrado expreso-inversa para resolver muy bien este problema

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

Se aumenta la ruta estándar que le permite pasar el nombre de la ruta como primer argumento

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

Permite construir la URL desde dentro de una plantilla por nombre

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

Le permite redirigir a una URL por su nombre

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

El problema con esto es que no funciona 'express.Router()', por lo que no puede usar 'router.route ('/ url'). Get () .post(). put() ', que es ** bastante ** útil –

0

I cosa esto es lo que busca: Named routes

Ejemplo de código:

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

Como se puede ver puede nombrar la ruta como admin.user.edit y acceder a ella en sus vistas

Cuestiones relacionadas