node.js - node - express url params



Usar rutas en Express-js (3)

El ejemplo de route-map express coincide con las rutas url con objetos que a su vez coinciden 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);

https://src-bin.com

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

Descargué la última versión de Express y comencé a codificar. Tengo una vista estática totalmente desarrollada en /, pero tan pronto como intento enviar parámetros, obtengo errores como este:

Cannot GET /wiki

Intenté seguir la guía en expressjs.com pero la forma en que uno usa las rutas ha cambiado en la última versión, lo que hace que la guía no se pueda utilizar.

Guía:

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

Generado por Express:

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

Mi problema surge cuando intento agregar otra ruta.

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

He intentado varios enfoques, pero sigo recibiendo el error Cannot GET /wiki (404).

routes / 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 agregar algunos parámetros (matrices en el mismo archivo) y esto estoy 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 puede explicarme qué me falta aquí? - Gracias.


Answer #1

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

La respuesta en esa publicación está vinculada al Repo Express en GitHub y sugiere mirar el ejemplo de ' 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í;

Necesito mis rutas en la aplicación.js:

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

Y agrego mis rutas de esta manera:

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 la raíz de mi aplicación, que contienen esto:

exports.edit = function(req, res) {

    var wiki_entry = req.params.id;

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

Answer #2

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

luego en index.js de los 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 sus controladores pasando quizás una conexión db en.





express