113 votes

Express: Comment passer d'instance d'application à des itinéraires à partir d'un fichier différent?

Je veux me séparer de mes itinéraires dans des fichiers différents, où l'un fichier qui contient toutes les routes et l'autre que les actions correspondantes. J'ai actuellement une solution pour faire cela j'ai besoin de faire l'application de l'instance mondiale pour être en mesure d'y accéder dans les actions. Mon installation actuelle ressemble à ceci:

app.js:

var express   = require('express');
var app       = express.createServer();
var routes    = require('./routes');

var controllers = require('./controllers');
routes.setup(app, controllers);

app.listen(3000, function() {
  console.log('Application is listening on port 3000');
});

routes.js:

exports.setup = function(app, controllers) {

  app.get('/', controllers.index);
  app.get('/posts', controllers.posts.index);
  app.get('/posts/:post', controllers.posts.show);
  // etc.

};

controllers/index.js:

exports.posts = require('./posts');

exports.index = function(req, res) {
  // code
};

controllers/posts.js:

exports.index = function(req, res) {
  // code
};

exports.show = function(req, res) {
  // code
};

Cependant, cette configuration a un gros problème: j'ai une base de données et une application-exemple j'ai besoin de passer à l'action (contrôleurs/*.js). La seule option que je pouvais penser, c'est de faire les deux variables globales, ce qui n'est pas vraiment une solution. Je veux séparer les itinéraires des actions parce que j'ai beaucoup de routes et que vous voulez les dans un endroit central.

Quelle est la meilleure façon de passer des variables à l'action, mais de séparer les actions de la routes?

177voto

Feng Points 710

Utilisez req.app , req.app.get('somekey')

La variable d'application créée en appelant express() est définie sur les objets requête et réponse.

Voir: https://github.com/visionmedia/express/blob/76147c78a15904d4e4e469095a29d1bec9775ab6/lib/express.js#L34-L35

105voto

Will Stern Points 1727

Node.js prend en charge les dépendances circulaires.
Faisant usage de dépendances circulaires au lieu de require('./routes')(app) nettoie beaucoup de code et fait de chaque module moins interdépendants sur le fichier de chargement:


app.js

var app = module.exports = express(); //now app.js can be required to bring app into any file

//some app/middleware setup, etc, including 
app.use(app.router);

require('./routes'); //module.exports must be defined before this line


routes/index.js

var app = require('../app');

app.get('/', function(req, res, next) {
  res.render('index');
});

//require in some other route files...each of which requires app independently
require('./user');
require('./blog');


-----04/2014 mise à jour-----

Express 4.0 fixe les cas d'utilisation pour la définition des itinéraires par l'ajout d'un express.routeur() la méthode!
documentation - http://expressjs.com/4x/api.html#router

Exemple de leur nouveau générateur:
L'écriture de la route:
https://github.com/expressjs/generator/blob/master/templates/js/routes/index.js
Ajout/namespacing à l'app: https://github.com/expressjs/generator/blob/master/templates/js/app.js#L24

Il y a encore usecases pour accéder à l'app à partir d'autres ressources, afin que les dépendances circulaires sont toujours une solution valable.

26voto

mihai Points 7035

Comme je l'ai dit dans les commentaires, vous pouvez utiliser une fonction comme module.exports. Une fonction est aussi un objet, vous n'avez donc pas besoin de changer votre syntaxe.

app.js

 var controllers = require('./controllers')({app: app});
 

controllers.js

 module.exports = function(params)
{
    return require('controllers/index')(params);
}
 

contrôleurs / index.js

 function controllers(params)
{
  var app = params.app;

  controllers.posts = require('./posts');

  controllers.index = function(req, res) {
    // code
  };
}

module.exports = controllers;
 

-1voto

Eldar Djafarov Points 4597

Pour la base de données, séparez le service d'accès aux données qui effectuera tout le travail de base de données avec une API simple et évitera l'état partagé.

La séparation de routes.setup ressemble à une surcharge. Je préférerais placer un routage basé sur la configuration. Et configurez les itinéraires en .json ou avec des annotations.

-8voto

tknew Points 1100

Les variables globales déclarées avec var sont locales dans le fichier.

Les variables globales déclarées sans var sont globales pour l'instance, vous pouvez donc y accéder via d'autres fichiers.

Au lieu de faire ça:

 var app = module.exports = express.createServer();
 

Faire ça:

 app = module.exports = express.createServer();
 

Maintenant, vous pouvez accéder à la variable de l'application dans d'autres fichiers

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