2012-01-14 21 views
44

Así que estoy empezando a usar Node.js. Vi el video con Ryan Dahl en Nodejs.org y escuché que recomendaba Express-js para sitios web.Usando rutas en Express-js

Descargué la última versión de Express y comencé a codificar. Tengo una visión estática de pleno derecho para arriba en /, pero tan pronto como lo intento envío de parámetros, recibo errores como este:

Cannot GET /wiki 

me trataron siguiendo la guía de expressjs.com pero la manera en que uno utiliza rutas ha cambiado en el última versión, lo que hace que la guía inutilizable.

Guía:

app.get('/users/:id?', function(req, res, next){ 
    var id = req.params.id; 
    if (id) { 
     // do something 
    } else { 
     next(); 
    } 
}); 

Generado por expreso:

app.get('/', routes.index); 

Mi problema surge cuando intento y añadir otra ruta.

app.get('/wiki', routes.wiki_show); 

que he probado un montón de enfoques, pero aparece el error Cannot GET /wiki (404).

rutas/index.js se ve así:

exports.index = function(req, res) { 
    res.render('index', { title: 'Test', articles: articles, current_article: current_article, sections: sections }) 
}; 

Lo único que hice allí fue añadir algunos parámetros (arrays en el mismo archivo) y esto yo trabajando. Pero cuando copio el contenido y cambio exports.index a exports.wiki o exports.wiki_show sigo recibiendo el error Cannot GET /wiki.

¿Alguien me puede explicar lo que me falta aquí? - Gracias.

+0

¿Agregó el enrutador middleware? – fent

+0

¿Has descargado el Express más reciente? ¿Lo obtuviste de Github o a través de NPM? –

+1

@DeaDEnD Sí, estoy bastante seguro de eso :) –

Respuesta

72

Entonces, después de crear mi pregunta, obtuve esta lista relacionada a la derecha con un problema similar: Organize routes in Node.js.

La respuesta en esa publicación vinculada al Express repo on GitHub y sugiere ver el ejemplo 'route-separation'.

Esto me ayudó a cambiar mi código, y ahora lo tengo funcionando. - Gracias por tus comentarios.

Mi implementación terminó luciendo así;

requiero mis rutas en las app.js:

var express = require('express') 
    , site = require('./site') 
    , wiki = require('./wiki'); 

Y añado mis rutas como esta:

app.get('/', site.index); 
app.get('/wiki/:id', wiki.show); 
app.get('/wiki/:id/edit', wiki.edit); 

Tengo dos archivos llamados wiki.js y site.js en el raíz de mi aplicación, que contiene esto:

exports.edit = function(req, res) { 

    var wiki_entry = req.params.id; 

    res.render('wiki/edit', { 
     title: 'Editing Wiki', 
     wiki: wiki_entry 
    }) 
} 
+3

Express es genial. Como principiante, también es útil construir un servidor web desde cero una vez para entender el nodo. Encontré aquí un tutorial que examiné y luego fui directo a expresarlo: http://nodebeginner.org/ – bryanmac

4

También podría organizarlos en módulos. Entonces sería algo así como

./ 
controllers 
    index.js 
    indexController.js 
app.js 

y luego en el indexController.js de los controladores exportan sus controladores.

//indexController.js 
module.exports = function(){ 
//do some set up 

var self = { 
    indexAction : function (req,res){ 
     //do your thing 
} 
return self; 
}; 

después en index.js de controladores dir

exports.indexController = require("./indexController"); 

y finalmente en app.js

var controllers = require("./controllers"); 

app.get("/",controllers.indexController().indexAction); 

Creo que este enfoque permite una separación más clara y también puede configurar su controladores pasando tal vez una conexión db en.

5

Parece que solo index.js se carga cuando lo requiera ("./ routes"). I utilizado el código siguiente en index.js para cargar el resto de las rutas:

var fs = require('fs') 
    , path = require('path'); 

fs.readdirSync(__dirname).forEach(function(file){ 
    var route_fname = __dirname + '/' + file; 
    var route_name = path.basename(route_fname, '.js'); 
    if(route_name !== 'index' && route_name[0] !== "."){ 
    exports[route_name] = require(route_fname)[route_name]; 
    } 
}); 
+0

Esta es una buena manera de evitar tener una tonelada de declaraciones 'require' si no estás agrupando tus rutas por un tipo del espacio de nombres – ZachB

+0

En realidad, cambiar la ~ última línea a 'exports [route_name] = require (route_fname)' lo hace para que luego pueda referirse a las rutas por un espacio de nombres, p. 'routes.users.show'. – ZachB

9

El route-map ejemplo expreso coincide con las rutas de URL con objetos que a su vez coincide con verbos HTTP con funciones. Esto establece el enrutamiento en un árbol, que es conciso y fácil de leer. Las entidades de las aplicaciones también se escriben como objetos con las funciones como métodos adjuntos.

var express = require('../../lib/express') 
    , verbose = process.env.NODE_ENV != 'test' 
    , app = module.exports = express(); 

app.map = function(a, route){ 
    route = route || ''; 
    for (var key in a) { 
    switch (typeof a[key]) { 
     // { '/path': { ... }} 
     case 'object': 
     app.map(a[key], route + key); 
     break; 
     // get: function(){ ... } 
     case 'function': 
     if (verbose) console.log('%s %s', key, route); 
     app[key](route, a[key]); 
     break; 
    } 
    } 
}; 

var users = { 
    list: function(req, res){ 
    res.send('user list'); 
    }, 

    get: function(req, res){ 
    res.send('user ' + req.params.uid); 
    }, 

    del: function(req, res){ 
    res.send('delete users'); 
    } 
}; 

var pets = { 
    list: function(req, res){ 
    res.send('user ' + req.params.uid + '\'s pets'); 
    }, 

    del: function(req, res){ 
    res.send('delete ' + req.params.uid + '\'s pet ' + req.params.pid); 
    } 
}; 

app.map({ 
    '/users': { 
    get: users.list, 
    del: users.del, 
    '/:uid': { 
     get: users.get, 
     '/pets': { 
     get: pets.list, 
     '/:pid': { 
      del: pets.del 
     } 
     } 
    } 
    } 
}); 

app.listen(3000);