48 votes

Utiliser les routes dans l'Express-js

Si je commence à utiliser Node.js. J'ai vu la vidéo avec Ryan Dahl, sur Nodejs.org et entendu, il a recommandé l'Express-js pour les sites web.

J'ai téléchargé la dernière version de Express, et ont commencé à coder. J'ai une véritable vision statique sur /, mais dès que j'ai essayer d'envoyer les paramètres, j'obtiens une erreur comme ceci:

Cannot GET /wiki

J'ai essayé de suivre le guide expressjs.com mais la façon dont on utilise les routes a changé dans la dernière version, ce qui rend le guide inutilisable.

Guide:

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

Généré par l'Express:

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

Mon problème survient lorsque j'essaie d'ajouter un autre itinéraire.

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

J'ai essayé un tas de démarches, mais je continue de recevoir l' Cannot GET /wiki (404) erreur.

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'ai fait il y a ajout de certains paramètres (les tableaux dans le même fichier) et cela, je travaille. Mais quand je copie le contenu et le changement exports.index de exports.wiki ou exports.wiki_show que j'ai toujours l' Cannot GET /wiki d'erreur.

Quelqu'un peut-il m'expliquer ce que je suis en manque ici? - Grâce.

76voto

Andreas Stokholm Points 1103

Donc, après, j'ai créé ma question, j'ai eu cette liste sur la droite avec un problème similaire: Organiser des routes dans Node.js.

La réponse dans ce post lié à l' Express repo GitHub et suggère de regarder la"route de séparation parexemple.

Cela m'a aidé à changer mon code, et j'ai maintenant ce qu'il fonctionne. - Merci pour vos commentaires.

Mon œuvre est terminé comme ceci;

J'ai besoin de mes trajets dans le app.js:

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

Et j'ajoute mes routes, 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 dans 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
    })
}

10voto

systemovich Points 2408

La route-map express exemple correspond à une url avec des objets qui à son tour correspond à l'adresse http verbes avec les fonctions. Ce qui pose le routage dans un arbre, qui est concis et facile à lire. Les applications les entités sont également écrits comme des objets avec les fonctions que les méthodes.

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

5voto

Shlomi Loubaton Points 471

Semble que seul index.js chargés lorsque vous avez besoin de("./routes") . J'ai utilisé le code suivant dans index.js pour charger le reste du parcours:

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

4voto

Maleck13 Points 552

Vous pouvez également organiser en modules. Il serait donc quelque chose comme.

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

et puis, dans la indexController.js des contrôleurs d'exporter 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 de 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 base de en.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X