Pasando argumentos a requerir (al cargar módulo)

¿Es posible pasar argumentos al cargar un módulo usando require?

Tengo módulo, login.js que proporciona funcionalidad de inicio de sesión. Requiere una conexión de base de datos, y quiero que se use la misma conexión de base de datos en todos mis módulos. Ahora exporto una función login.setDatabase (…) que me permite especificar una conexión de base de datos, y eso funciona bien. Pero prefiero pasar la base de datos y cualquier otro requisito cuando cargue el módulo.

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

Soy bastante nuevo con NodeJS y normalmente desarrollo utilizando Java y Spring Framework, así que sí … esto es una inyección de constructor 🙂 ¿Es posible hacer algo como el código que proporcioné anteriormente?

Basado en tus comentarios en esta respuesta , hago lo que intentas hacer así:

 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; }; 

Estructuro casi todos mis módulos así. Parece que funciona bien para mí.

Sí. En su módulo de login , solo exporte una única función que tome la db como su argumento. Por ejemplo:

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

No estoy seguro de si esto seguirá siendo útil para las personas, pero con ES6 tengo una forma de hacerlo que me parece limpia y útil.

 class MyClass { constructor ( arg1, arg2, arg3 ) myFunction1 () {...} myFunction2 () {...} myFunction3 () {...} } module.exports = ( arg1, arg2, arg3 ) => { return new MyClass( arg1,arg2,arg3 ) } 

Y luego obtienes tu comportamiento esperado.

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

Otra forma de hacer las cosas es definir primero los métodos y luego ponerlos a disposición a través de “exportaciones” (módulo. Exportaciones y exportaciones se refieren al mismo objeto)

 function kamehameha(name,fame){ } function bigbangkamehameha(name){ } exports.kamehameha=kamehameha; exports.bigbang=bigbangkamehameha; //bigbang refers to bigbangkamehameha