web-dev-qa-db-fra.com

Passer des arguments à demander (lors du chargement du module)

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

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

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

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

103
Andreas Selenwall

Basé sur vos commentaires dans cette réponse , je fais ce que vous essayez de faire comme ceci:

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 comme ça. Semble bien fonctionner pour moi.

218
floatingLomas

Oui. Dans votre module login, exportez simplement une seule fonction prenant l'argument db. Par exemple:

module.exports = function(db) {
  ...
};
30
David Weldon

Je ne sais pas si cela sera toujours utile aux gens, mais avec ES6, j'ai un moyen 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 puis vous obtenez votre comportement attendu.

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