Korzystanie z tras w Express-js

Więc zaczynam używać Node.js. Widziałem film z Ryanem Dahlem na Nodejs.org i słyszałem, że polecił Express-js dla stron internetowych.

Pobrałem najnowszą wersję Express i zacząłem kodować. Mam pełnowartościowy widok statyczny NA/, ale jak tylko spróbuję wysłać parametry, dostaję takie błędy:

Cannot GET /wiki

Próbowałem podążać za poradnikiem na expressjs.com ale sposób korzystania z tras zmienił się w najnowszej wersji, co sprawia, że 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ę dodać inną trasę.

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

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

Trasy / indeks.js wygląda tak:

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

Jedyne co tam zrobiłem to dodanie kilku parametrów (tablic w tym samym pliku) i to działa. Ale kiedy skopiuję zawartość i zmienię exports.index na exports.wiki lub exports.wiki_show nadal dostaję Cannot GET /wiki błąd.

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

Author: Andreas Stokholm, 2012-01-14

4 answers

Więc, po stworzeniu mojego pytania, mam tę powiązaną listę po prawej stronie z podobnym problemem: organizuj trasy w węźle.js .

Odpowiedź w tym poście powiązana z Express repo na GitHub i sugeruje, aby spojrzeć na przykład " route-separation".

To pomogło mi zmienić mój kod, I teraz mam go działa. - Dzięki za komentarz.

Moja implementacja wyglądała tak;

Wymagam moich tras w app.js:

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

I dodaję swoje trasy tak:

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

Mam dwa pliki o nazwie wiki.js i site.js w katalogu głównym 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
    })
}
 73
Author: Andreas Stokholm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:33:59

Przykład route-map express dopasowuje ścieżki url do obiektów, które z kolei dopasowują czasowniki http do funkcji. To układanie trasy w drzewie, które jest zwięzłe i łatwe do odczytania. Encje aplikacji są również zapisywane jako obiekty, a funkcje 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);
 10
Author: systemovich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-15 13:44:53

Wydaje się, że tylko indeks.js get loaded when you require("./ trasy"). Użyłem poniższego kodu w indeksie.js do załadowania reszty tras:

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];
  }
});
 5
Author: Shlomi Loubaton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-30 10:13:15

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

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

A następnie w indexController.js kontrolerów eksport kontrolerów.

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

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

Następnie w indeksie.js kontrolerów dir

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

I wreszcie w app.js

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

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

Myślę, że takie podejście pozwala na wyraźniejszą separację, a także możesz skonfigurować swoje Kontrolery, przekazując być może połączenie db.

 4
Author: Maleck13,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-04 18:42:02