Je commence donc à utiliser Node.js. J'ai vu la vidéo avec Ryan Dahl sur Nodejs.org et j'ai entendu dire qu'il recommandait Express-js pour les sites Web.
J'ai téléchargé la dernière version d'Express et j'ai commencé à coder. J'ai une vue statique complète sur /, mais dès que j'essaie d'envoyer des paramètres, j'obtiens des erreurs comme celle-ci:
Cannot GET /wiki
J'ai essayé de suivre le guide sur expressjs.com mais la façon dont on utilise les itinéraires a changé dans la dernière version, ce qui rend le guide inutilisable.
Guider:
app.get('/users/:id?', function(req, res, next){
var id = req.params.id;
if (id) {
// do something
} else {
next();
}
});
Généré par Express:
app.get('/', routes.index);
Mon problème se pose lorsque j'essaie d'ajouter un autre itinéraire.
app.get('/wiki', routes.wiki_show);
J'ai essayé de nombreuses approches, mais l'erreur continue à apparaître avec l'erreur Cannot GET /wiki
(404).
routes/index.js ressemble à ceci:
exports.index = function(req, res) {
res.render('index', { title: 'Test', articles: articles, current_article: current_article, sections: sections })
};
La seule chose que j’y ai faite a été d’ajouter quelques paramètres (tableaux dans le même fichier) et c’est ce que je travaille. Mais lorsque je copie le contenu et que je modifie exports.index
En exports.wiki
Ou exports.wiki_show
, J'obtiens toujours l'erreur Cannot GET /wiki
.
Quelqu'un peut-il m'expliquer ce qui me manque ici? - Merci.
Ainsi, après avoir créé ma question, cette liste associée sur la droite présente un problème similaire: Organiser les itinéraires dans Node.js .
La réponse de cet article est liée au Express repo sur GitHub et suggère de regarder l'exemple ' route-separation '.
Cela m'a aidé à changer mon code et je le fais maintenant fonctionner. - Merci pour vos commentaires.
Ma mise en œuvre a fini par ressembler à ceci;
J'ai besoin de mes routes dans le fichier app.js:
var express = require('express')
, site = require('./site')
, wiki = require('./wiki');
Et j'ajoute mes itinéraires comme ceci:
app.get('/', site.index);
app.get('/wiki/:id', wiki.show);
app.get('/wiki/:id/edit', wiki.edit);
J'ai deux fichiers appelés wiki.js et site.js à la racine de mon application, contenant ceci:
exports.edit = function(req, res) {
var wiki_entry = req.params.id;
res.render('wiki/edit', {
title: 'Editing Wiki',
wiki: wiki_entry
})
}
L’exemple route-map express fait correspondre les chemins d’URL avec des objets qui, à leur tour, font correspondre les verbes http aux fonctions. Cela établit le routage dans un arbre, qui est concis et facile à lire. Les entités des applications sont également écrites en tant qu'objets avec les fonctions en tant que méthodes incluses.
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);
Il semble que seul index.js soit chargé lorsque vous avez besoin ("./ routes"). J'ai utilisé le code suivant dans index.js pour charger le reste des routes:
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];
}
});
Vous pouvez également les organiser en modules. Donc, ce serait quelque chose comme.
./
controllers
index.js
indexController.js
app.js
puis dans le fichier indexController.js des contrôleurs, exportez vos contrôleurs.
//indexController.js
module.exports = function(){
//do some set up
var self = {
indexAction : function (req,res){
//do your thing
}
return self;
};
puis dans index.js des contrôleurs dir
exports.indexController = require("./indexController");
et enfin dans app.js
var controllers = require("./controllers");
app.get("/",controllers.indexController().indexAction);
Je pense que cette approche permet une séparation plus claire et vous pouvez également configurer vos contrôleurs en passant peut-être une connexion à la base de données.