2012-04-03 20 views
11

Tengo rutas en una carpeta separada para expressjs. La configuración funciona bien para la página 'índice', pero no para ninguna ruta adicional.nodejs Las rutas ExpressJS solo funcionan para el índice

Este es mi index.js, dentro de la carpeta de mi ruta.

module.exports = function(db) { 

    return { 
     index: function(req, res, next) { 
      res.send('index'); 
     } 
    } 
} 

Este es mi join.js, dentro de la carpeta de mi ruta.

module.exports = function(db) { 

    return { 
     join: function(req, res, next) { 
      res.send('join'); 
     } 
    } 
} 

En mis app.js, defino mis rutas como esta:

  var routes = require('./routes')(db); 
      app.get('/', routes.index); 
      app.get('/join', routes.join); 

Cuando voy a http://localhost:3000 pero cuando voy a http://localhost:3000/join me sale Cannot GET /join

Si defino mi ruta para unirse como este:

app.get('/join', function(req, res){ 
    res.send('join 2'); 
}); 

Esto funciona.

¿Alguna idea de lo que estoy haciendo mal aquí?

¡Gracias!

Respuesta

0

He probado un escenario similar y funcionó para mí.

Supongo que el error probablemente se encuentre en el archivo routes.js. es probable haciendo:

routes.index = require('./index')(db); 
routes.join = require('./join')(db); 

Tal vez se olvida de llamar al método para join, simplemente haciendo require(./join). Solo una conjetura.

6

Estaba teniendo un problema similar, pero luego recordé que todo esto es "solo javascript" y pude confundir una respuesta.

Si usted quiere tener sus rutas definido en varios archivos (en lugar de abarrotar todos en un archivo de rutas/index.js) sólo se puede construir las vías objeto de una manera hacker (como sigue):

var express = require('express') 
    , routes = { 
     index: require('./routes').index 
    , events: require('./routes/events.js').events 
    } 
    , hbs = require('hbs'); 

NOTA: No necesita necesita las definiciones express y hbs (primera y última línea) allí, simplemente lo puse ahí para darle un pequeño contexto. Este fragmento de código vino directamente de la parte superior de mi archivo app.js.

Observe .index y .events encadenados a las llamadas a la función require(). Esa es la clave. Mi archivo events.js sólo tiene una exportación (eventos):

exports.events = function(req, res){ 
    console.log('in events'); 
    res.render('events', { events: events, title: "EVENTS" }); 
    console.log('events done'); 
}; 

Dado que la función require() agarra esencialmente un archivo y no requiere ningún (importaciones) Vars no privados (es decir, las vinculadas a la exports objeto especial) y los expone al archivo que contiene la llamada require(), solo puedo obtener la función específica que estoy solicitando del archivo que estoy incluyendo con la llamada require().Si hubiera varias exportaciones se define en el archivo requerido, imagino que podía agarrarlos como tal (no se han probado):

routes = { 
    index: require('./routes').index 
    , events: require('./routes/events.js').events 
    , favorites: require('./routes/events.js').favorites 
    , upcoming: require('./routes/events.js').upcoming 
} 

Sospecho que esto daría a alguien con un montón de nodejs o MVC experimentar un aneurisma si leen tu código (apuesto a que incluiría el mismo archivo 3 veces, pero no estoy seguro). Quizás sea mejor que hacer:

routes = { 
    index: require('./routes').index 
    , events: require('./routes/events.js').events 
    , favorites: require('./routes/favorites.js').favorites 
    , upcoming: require('./routes/upcoming.js').upcoming 
} 

De lo contrario, ¿por qué no meterlos todos en el índice? No es muy seguro, sin embargo, esto es sólo mi segundo día de trabajo con el Nodo y cualquiera de sus tecnologías relacionadas ...

También probablemente le ayudará si usted lanza un comunicado console.log justo después de sus declaraciones var:

console.log(routes); 
+0

+1 "pero luego recordé que esto es todo" solo javascript "y fue capaz de confundir una respuesta". !! Fabulosa respuesta :) –

+0

"Los módulos se almacenan en caché después de la primera vez que se cargan" http://nodejs.org/api/modules.html#modules_caching –

3

La razón por la cual el archivo routes/index.js funciona y sus rutas/join.js no se debe a las reglas de carga del módulo de Node. Consulte los documentos para modules/folders as modules

Dice que intentará cargar estos archivos en orden. package.json, index.js, index.node.

Puede cambiar el archivo que carga creando un archivo package.json en el directorio. Establezca la propiedad main en el nombre del archivo nuevo.

Un ejemplo de cómo hacer que las rutas funcionen como lo desea es en another question.

0

si sólo decir

var routes = require('./routes') 

Por defecto, el nodo va a empezar a buscar el archivo de índice (si se trata de index.js o index.node). Si desea utilizar su archivo de unión, tendrá que decirlo explícitamente:

var join = require('./routes/join') 

Ahora creo que join.join debería funcionar.

0

Tuve un problema similar.

Solo funcionó mi ruta "/". Al tratar de crear "/ about" obtendría un error 404.

Resulta que cuando solía expresar-generador que escribió:

app.use('/about', ...etc) 

lugar que debería haber sido:

app.all('/about', ...etc) 

Sé que no es exactamente el mismo problema, pero esto es para los perros callejeros que se se encuentran aquí buscando la misma pregunta para el problema "solo funciona el índice ...".

Cuestiones relacionadas