136 votes

Passage d'arguments à require (lors du chargement du module)

Est-il possible de passer des arguments lors du chargement d'un module en utilisant require ?

J'ai un module, login.js, qui fournit une fonctionnalité de connexion. Il nécessite une connexion à une base de données, et je veux que la même connexion soit utilisée dans tous mes modules. J'ai exporté une fonction login.setDatabase(...) qui me permet de spécifier une connexion à la base de données, et cela fonctionne très bien. Mais je préférerais transmettre la base de données et toute autre exigence lorsque je charge le module.

var db = ...
var login = require("./login.js")(db);

Je suis assez nouveau avec NodeJS et je développe habituellement en utilisant Java et le Spring Framework, donc oui... c'est une injection de constructeur :) Est-il possible de faire quelque chose comme le code que j'ai fourni ci-dessus ?

252voto

floatingLomas Points 734

Sur la base de vos commentaires dans cette réponse je fais ce que tu essaies de faire comme ça :

module.exports = function (app, db) {
    var module = {};

    module.auth = function (req, res) {
        // This will be available 'outside'.
        // Authy stuff that can be used outside...
    };

    // Other stuff...
    module.pickle = function(cucumber, herbs, vinegar) {
        // This will be available 'outside'.
        // Pickling stuff...
    };

    function jarThemPickles(pickle, jar) {
        // This will be NOT available 'outside'.
        // Pickling stuff...

        return pickleJar;
    };

    return module;
};

Je structure à peu près tous mes modules de cette façon. Cela semble bien fonctionner pour moi.

50voto

vovkman Points 396

Je ne sais pas si cela sera toujours utile aux gens, mais avec ES6, j'ai une façon de le faire que je trouve propre et utile.

class MyClass { 
  constructor ( arg1, arg2, arg3 )
  myFunction1 () {...}
  myFunction2 () {...}
  myFunction3 () {...}
}

module.exports = ( arg1, arg2, arg3 ) => { return new MyClass( arg1,arg2,arg3 ) }

Et ensuite, vous obtenez le comportement attendu.

var MyClass = require('/MyClass.js')( arg1, arg2, arg3 )

33voto

David Weldon Points 14329

Oui. Dans votre login il suffit d'exporter une seule fonction qui prend le module db comme argument. Par exemple :

module.exports = function(db) {
  ...
};

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