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.
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
})
}
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);
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];
}
});
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.
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