59 votes

Nodejs. Meilleure façon de passer des variables communes dans des modules séparés

J'utilise des fichiers de routeur distincts en tant que modules pour l'application principale et l'application d'authentification. Je n'arrive pas à trouver le meilleur moyen de transmettre des variables (client de base de données) aux routeurs. Je ne veux pas le coder en dur ou le transmettre avec:

 module.exports = function(app, db) {
 

Peut-être que c'est la meilleure façon d'utiliser singleton register ou d'utiliser une variable globale de base de données?

Quelle est votre expérience avec les motifs de conception? Quel est le meilleur chemin et pourquoi?

109voto

Domenic Points 40761

J'ai trouvé à l'aide de l'injection de dépendance, de passer des choses pour être le meilleur style. Il serait en effet ressembler à quelque chose que vous avez:

// App.js
module.exports = function App() {
};

// Database.js
module.exports = function Database(configuration) {
};

// Routes.js
module.exports = function Routes(app, database) {
};

// server.js: composition root
var App = require("./App");
var Database = require("./Database");
var Routes = require("./Routes");
var dbConfig = require("./dbconfig.json");

var app = new App();
var database = new Database(dbConfig);
var routes = new Routes(app, database);

// Use routes.

Cela a un certain nombre d'avantages:

  • Il vous force à vous séparer de votre système en composants avec claire dépendances, au lieu de cacher les dépendances quelque part dans le milieu du fichier où qu'ils appellent require("databaseSingleton") ou pire, global.database.
  • Il rend les tests unitaires très simple: si je veux tester Routes dans l'isolement, je peux l'injecter avec des fausses app et database params et de tester seulement l' Routes code lui-même.
  • Il met l'ensemble de votre objet graphique de câblage de l'ensemble en un seul endroit, à savoir la composition de la racine (qui dans ce cas est - server.js, l'application de point d'entrée). Cela vous donne un seul endroit à regarder pour voir comment le tout s'intègre dans le système.

L'une des meilleures explications pour ce que j'ai vu, c'est une entrevue avec Mark Seeman, auteur de l'excellent livre de l'Injection de Dépendance dans la .NET. Il s'applique tout autant à JavaScript, et en particulier à Node.js: require est souvent utilisé comme un classique de la localisateur de service, au lieu de seulement un système de module.

2voto

akaravashkin Points 44

Je vous suggère de créer un fichier de paramètres avec instance de base de données et avec d’autres éléments dont vous avez besoin, tels que «singleton».

Par exemple, j’ai settings.js avec mon client Redis Db:

 var redis = require('redis');
exports.redis = redis.createClient(6379, '127.0.0.1');
 

Et dans d'autres modules multiples, je l'inclus:

 var settings = require('./settings');
setting.redis.<...>
 

Plusieurs fois, y compris, j’ai toujours une instance de connexion à la base de données.

0voto

Vinz243 Points 1196

Il est complètement obsolète, mais vous pouvez utiliser global dans un script:

  global.foo = new Foo();
 

dans un autre script:

  foo.bar();
 

Vous pouvez également utiliser une constante déjà existante:

  Object.foo = new Foo();
 

Et ici :

  Object.foo.bar();
 

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