2012-04-03 6 views
11

Ich habe Routen in separaten Ordner für Expressjs. Das Setup funktioniert gut für die 'Index'-Seite, aber nicht für zusätzliche Routen.nodejs ExpressJS Routen funktioniert nur für Index

Dies ist meine index.js, in meinem Routenordner.

module.exports = function(db) { 

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

Dies ist meine join.js, in meinem Ordner Routen.

module.exports = function(db) { 

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

In meinem app.js definiere ich meine Routen wie folgt aus:

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

Als ich nach http://localhost:3000 gehen, aber wenn ich zu http://localhost:3000/join gehe ich bekommen Cannot GET /join

Wenn ich meine Route definieren für verbinden wie folgt:

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

Dies funktioniert.

Irgendeine Idee, was ich hier falsch mache?

Vielen Dank!

Antwort

0

Ich testete ein ähnliches Szenario und es funktionierte für mich.

Ich vermute, der Fehler liegt wahrscheinlich in Ihrer routes.js-Datei. Sie tun wahrscheinlich:

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

Vielleicht haben Sie vergessen, das Verfahren für join zu nennen, nur require(./join) tun. Nur eine Vermutung.

6

Ich hatte ein ähnliches Problem, aber dann erinnerte ich mich das ist alles "nur Javascript" und war in der Lage, eine Antwort zu verwirren.

Wenn Sie in mehreren Dateien Ihre Routen definiert haben (anstatt sie alle in eine Routen/index.js Datei pauken) bauen Sie können nur die Routen in einem hackish Weise Objekt (wie folgt):

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

HINWEIS: Sie nicht benötigen die Express-und HBs-Definitionen (erste und letzte Zeile) drin, ich habe es nur dort, um Ihnen ein wenig Kontext. Dieses Code-Snippet stammt direkt von meiner app.js-Datei.

Beachten Sie die .index und .events verkettet auf die require() Funktionsaufrufe. Das ist der Schlüssel. Meine events.js Datei hat nur einen Export (Ereignisse):

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

Da die require() Funktion im Wesentlichen eine Datei packt und erfordert (Importe) alle nicht-privaten Vars (das heißt, diejenigen, die an der speziellen exports Objekt) und stellt sie der Datei zur Verfügung, die den require() Aufruf enthält, kann ich die spezifische Funktion, die ich benötige, einfach aus der Datei abrufen, die ich mit dem require()-Aufruf einschließe.Wenn ich in der gewünschten Datei mehrere Exporte definiert hatte, stelle ich mir ich sie greifen konnte wie so (nicht getestet):

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

Ich vermute, dass dies jemand mit einem Bündel von NodeJS oder MVC ein Aneurysma erleben geben würde, wenn Sie lesen Ihren Code (ich wette, dass es die gleiche Datei dreimal enthalten würde, aber ich bin mir nicht wirklich sicher). Vielleicht besser dran zu tun:

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

Ansonsten, warum nicht alle im Index schieben? Nicht wirklich sicher, aber das ist nur mein zweiter Tag der Arbeit mit Knoten und einem seiner verbundenen Technologien ...

wahrscheinlich auch Ihnen helfen, wenn Sie eine console.log Anweisung direkt nach dem var Erklärungen werfen:

console.log(routes); 
+0

+1 "aber dann erinnerte, das ist alles" nur Javascript "und war in der Lage, eine Antwort zu verwirren." !! Fabelhafte Antwort :) –

+0

"Module werden zwischengespeichert, nachdem sie das erste Mal geladen wurden" http://nodejs.org/api/modules.html#modules_caching –

3

Der Grund, warum die Datei routes/index.js funktioniert und Ihre routes/join.js nicht, liegt an den Regeln zum Laden von Knoten. Überprüfen Sie die Dokumentation für modules/folders as modules

Es heißt, dass es versuchen wird, diese Dateien in Reihenfolge zu laden. package.json, index.js, index.node.

Sie können die geladene Datei ändern, indem Sie im Verzeichnis eine package.json-Datei erstellen. Setzen Sie die Eigenschaft main auf den Namen der neuen Datei.

Ein Beispiel, wie die Routen so funktionieren, wie Sie möchten, ist another question.

0

wenn man nur sagen

var routes = require('./routes') 

standardmäßig Knoten für die Indexdatei suchen beginnen wird (ob es index.js oder index.node). Wenn Sie Ihre Datei beitreten verwenden möchten, müssen Sie dies explizit sagen:

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

Jetzt sollte ich denken join.join arbeiten.

0

Hatte ähnliches Problem.

Nur meine "/" Route hat funktioniert. Beim Versuch, "/ about" zu erstellen, würde ich einen Fehler 404 bekommen.

Es stellte sich heraus, wenn ich Express-Generator verwendet, schrieb er:

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

Stattdessen sollte es gewesen sein:

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

Ich weiß, es ist nicht genau das gleiche Problem, aber dies ist für die Streuner, die finde hier die gleiche Frage nach dem "only index works ..." Problem.

Verwandte Themen