Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

83
Vistas
Accede a objetos genéricos desde diferentes archivos con Node.js

Para un proyecto de Node.js en el que he estado trabajando desde que era adolescente con una gran cantidad de archivos diferentes, tengo un montón de objetos que se declaran e inicializan en index.js . Todas mis llamadas a funciones comienzan aquí también.

Para asegurarme de que otros archivos puedan acceder a estos objetos si es necesario, los he estado pasando como parámetros para cada función principal, que ahora que lo reconsidero, parece muy ineficiente: estos objetos nunca se modifican y serán los mismos cada vez que las funciones se llaman de todos modos.

En lugar de pasar estos objetos de uso frecuente como parámetros cada vez, ¿podría hacerlo para poder acceder a ellos a pedido desde cualquiera de los archivos del proyecto? Si lo deja más claro, en su mayoría son referencias a una base de datos, por lo que no cambian.

Lo que ya consideré:

  • Variables globales. Supongo que esto funcionaría, pero prefiero no usarlos y siento que debería haber una forma mucho más limpia de hacerlo que simplemente no veo.
  • Algún tipo de captador: he usado require para hacer algunos archivos con funciones genéricas que se pueden llamar desde cualquier parte del proyecto siempre que requiera el archivo con la función genérica desde donde quiero llamarlo, así que probé esto en index.js : exports.getClient = function() { return client; }; Esto no funcionó para mí, porque si uso require('./index.js') en cualquier archivo desde donde quiero acceder al client , se inicializará index.js nuevamente, lo que resultará en oyentes dobles y demás.
  • Lo anterior, pero coloco mis objetos genéricos en un archivo separado con una función para inicializarlos que puedo llamar desde index.js al inicio. Entonces no hay problema cuando necesito ese archivo, porque eso no llamaría a la inicialización por segunda vez. Sin embargo, si es posible, prefiero mantener la inicialización de estos objetos en index.js .

Ahora que lo pienso, no sé si dos archivos que se llaman entre sí harían que se ejecutaran continuamente entre sí en primer lugar: solo estaba ejecutando un archivo específico que requería (y, por lo tanto, ejecutaba) index.js durante la prueba en lugar de todo. Probaré esto después de dormir y publicaré una edición, pero aún publicaré esto por ahora.

Ejemplo de mi código:

 // index.js const client = new Client(); const db = initialiseDb(); const dbDoc1 = db.doc('1'); const dbDoc2 = db.doc('2'); const dbDoc3 = db.doc('3'); client.on('event', (data) => { require('./someFile').someMethod(data, client, dbDoc1, dbDoc2, dbDoc3); }

Entonces, en lugar de escribir require('./someFile').someMethod(data, client, dbDoc1, dbDoc2, dbDoc3); , prefiero usar require('./someFile').someMethod(data); y simplemente obtenga cualquiera de los objetos genéricos más adelante en caso de que someMethod() termine necesitándolos. Espero que haya alguna manera limpia de lograr esto.

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Muy bien, parece que mi segunda solución funcionaría después de todo. Lo que me preocupaba pero no conocía la palabra eran las dependencias circulares . Resulta que Node.js los maneja bastante bien y solo requiere importar un archivo una vez, por lo que no se ejecuta nuevamente si un archivo es ejecutado por un archivo que ya lo requiere.

Probado así:

 // test1.js function callTest1() { console.log('test1.js checking in: ' + Date.now()); } exports.callTest = callTest1; console.log('test1.js is executing'); const test2 = require('./test2'); test2.callTest(); // test2.js function callTest2() { console.log('test2.js checking in: ' + Date.now()); } exports.callTest = callTest2; console.log('test2.js is executing'); const test1 = require('./test1'); test1.callTest();

Resultado al ejecutar test1.js :

 test1.js is executing test2.js is executing test1.js checking in: 1643405381177 test2.js checking in: 1643405381178

Lo que pasa es lo siguiente:

  1. test1.js define callTest1() y lo agrega a su module.exports
  2. test1.js registra test1.js is executing
  3. test1.js requiere test2.js , que ahora se ejecuta
  4. test2.js define callTest2() y lo agrega a su module.exports
  5. test2.js registra test2.js is executing
  6. test2.js requiere test1.js , pero ya se ejecutó, así que esto no volverá a suceder
  7. test2.js llama a test1.callTest() , que registra el registro test1.js checking in: 1643405381177
  8. test1.js termina de ejecutar test2.js
  9. test1.js llama a test2.callTest() , que registra el registro test2.js checking in: 1643405381178

Entonces, parece que puedo colocar mis 'captadores' en mi archivo index.js . Solo tendré que tener en cuenta el orden en que se cargan los archivos, por lo que no necesito index.js antes de agregar sus getters a module.exports . Dejaré esta pregunta sin respuesta por ahora, en caso de que alguien aparezca con una solución más limpia.

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda