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?
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.
Oui. Dans votre module login
, exportez simplement une seule fonction prenant l'argument db
. Par exemple:
module.exports = function(db) {
...
};
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 )