2012-01-14 25 views
44

Zaczynam korzystać z Node.js. Widziałem wideo z Ryanem Dahlem pod numerem Nodejs.org i usłyszałem, że polecił Express-js na strony internetowe.Korzystanie z tras w Express-js

Pobrałem najnowszą wersję Express i zacząłem kodować. Mam pełnoprawną widoku statycznych się na /, ale jak tylko próbuję wysyłania parametrów, pojawiają się błędy tak:

Cannot GET /wiki 

Próbowałem po prowadnicy na expressjs.com ale sposób jeden korzysta trasy zmieniło się w najnowszą wersję, dzięki której przewodnik nie nadaje się do użytku.

Przewodnik:

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

Wygenerowane przez Express:

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

Mój problem pojawia się, gdy próbuję i dodać kolejną trasę.

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

Próbowałem kilka podejść, ale wciąż otrzymuję błąd Cannot GET /wiki (404).

trasy/index.js wygląda następująco:

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

Jedyną rzeczą, jaką zrobiłem było dodać kilka parametrów (tablice w tym samym pliku) i to mi działa. Ale po skopiowaniu zawartości i zmianie exports.index na exports.wiki lub exports.wiki_show nadal otrzymuję błąd Cannot GET /wiki.

Czy ktoś może mi wyjaśnić, czego tu brakuje? - Dzięki.

+0

Czy dodano oprogramowanie pośrednie routera? – fent

+0

Pobrałeś najnowszy Express? Dostałeś to od Githuba lub poprzez NPM? –

+1

@DeaDEnD Tak, jestem tego pewien :) –

Odpowiedz

72

Po utworzeniu pytania otrzymałem tę listę po prawej stronie z podobnym problemem: Organize routes in Node.js.

Odpowiedź w tym poście połączona z Express repo on GitHub i sugeruje, aby obejrzeć przykład "route-separation".

Pomogło mi to zmienić mój kod, a teraz działam. - Dzięki za twoje komentarze.

Moja implementacja skończyła się tak;

wymagam moje trasy w app.js:

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

I dodam moje trasy tak:

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

Mam dwa pliki zwane wiki.js i site.js w katalog główny mojej aplikacji, zawierający to:

exports.edit = function(req, res) { 

    var wiki_entry = req.params.id; 

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

Express jest świetny. Jako początkujący dobrze jest zbudować serwer sieciowy od podstaw, aby zrozumieć węzeł. Znalazłem tutorial, w którym przeszedłem, a następnie od razu powiedziałem: http://nodebeginner.org/ – bryanmac

4

Można również zorganizować je w moduły. Więc byłoby coś takiego.

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

, a następnie w indexController.js z kontrolerów eksportuj swoje kontrolery.

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

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

następnie w index.js kontrolerów reż

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

i wreszcie w app.js

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

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

myślę, że to podejście pozwala na wyraźniejsze separacji, a także można skonfigurować kontrolery przekazując może połączenie db w.

5

Wygląda na to, że tylko index.js zostanie załadowany, gdy będzie to wymagane ("./ trasy"). Użyłem następujący kod w index.js załadować resztę trasy:

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

To jest dobry sposób na uniknięcie mnóstwa instrukcji 'require', jeśli nie grupujesz tras przez sortowanie przestrzeni nazw. – ZachB

+0

W rzeczywistości, zmiana ~ ostatniej linii na 'exports [nazwa_ruty] = require (route_fname)' sprawia, że ​​możesz później odwoływać się do tras według przestrzeni nazw, np. 'routes.users.show'. – ZachB

9

route-map express przykład pasuje ścieżki URL z obiektów, które z kolei pasuje czasowników HTTP funkcji. Określa to routing w drzewie, które jest zwięzłe i łatwe do odczytania. Podmioty aplikacji są również zapisywane jako obiekty z funkcjami jako zamknięte metody.

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