¿Es posible pasar argumentos al cargar un módulo usando require?
Tengo el módulo, login.js que proporciona la funcionalidad de inicio de sesión. Requiere una conexión a la base de datos y quiero que se use la misma conexión a la 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 generalmente desarrollo usando Java y Spring Framework, así que sí ... esta es una inyección de constructor :) ¿Es posible hacer algo como el código que proporcioné anteriormente?
app
objeto a los módulos requeridos.Respuestas:
Según sus comentarios en esta respuesta , hago lo que está tratando de hacer así:
Estructuro casi todos mis módulos así. Parece que funciona bien para mí.
fuente
app
necesario el argumento o puedo omitirlo? Mi módulo no hará un uso explícito de este argumento de la aplicación, pero no sé si node.js lo requiere para algo interno. Si está bien, la declaración de mi módulo se vería así:module.exports = function (db) {
require(mymodule)(myargs)
le daría un módulo con el que trabajar. Sin embargo, si lo hace referencia a otro lugar de otro módulo? en el sistema básico parece haber un caché involucrado, pero en este sistema, el caché devolvería el método del generador desnudo en llamadas posteriores arequire()
, y si le pasaba argsrequire()(someargs)
, obtendría un módulo diferente ... tal vez me falta algovar module;
fuera de la función de exportación, y luego, tan pronto como ingrese a la, querrá verificar simodule
ya está definido, y si es así, simplemente devuélvalo (y si no, inicialícelo). ¿Tiene sentido?No estoy seguro de si esto seguirá siendo útil para la gente, pero con ES6 tengo una forma de hacerlo que encuentro limpia y útil.
Y luego obtienes tu comportamiento esperado.
fuente
Si. En su
login
módulo, simplemente exporte una única función que tomedb
como argumento. Por ejemplo:fuente
module.exports = function(app,db) { ... } module.exports.auth = function(req,res) { ... authentication stuff }
, llama a la función "anónima" y establece las variablesapp
ydb
, pero, al hacer esto, mi aplicación no encuentra laauth
función. ¿Qué estoy haciendo mal? Si elimino la función anónima, laauth
función vuelve a ser accesible.exports
es un objeto. Puede asignarle propiedades (múltiples exportaciones) o puede asignarle un valor. Parece que asignó exportaciones a una función, pero luego asignó autenticación como una propiedad de la función que asignó a las exportaciones. Por lo tanto, tendría que hacer lovar auth = require("./login.js").auth
que puede no ser lo que pretendía. Si desea utilizar el patrón de la pregunta original, probablemente sea mejor ceñirse a un único valor de exportación. Si esto aún no tiene sentido, recomendaría publicar un resumen para que lo vea.auth
como propiedad delexports
objeto, y luego en el módulo que asignóexports
a una función (anulando así la asignación anterior). Si invierte el orden de la asignación, debería poder acceder a laauth
función como esperaba. De nuevo, es difícil saberlo sin ver el código.var login = require('login')
yvar login = require('login')(app)
, pero hay una gran diferencia, no hay magia en la función anónima devuelta, es solo otra función / objeto. En lugar de tener unamodule.exports.auth
, la función anomima ahora devuelve la función auth (entre otras), es decirreturn { auth: authFunction, login: loginFunction}
. Entonces ahora funciona. Gracias.