Te recomendamos que revises esta solución en un entorno controlado antes de enviarlo a producción, un saludo.
Solución:
Intente establecer propiedades en module.exports
, en lugar de reemplazarlo por completo. P.ej, module.exports.instance = new ClassA()
en a.js
, module.exports.ClassB = ClassB
en b.js
. Cuando crea dependencias de módulos circulares, el módulo requerido obtendrá una referencia a un módulo incompleto module.exports
desde el módulo requerido, al que puede agregar otras propiedades más tarde, pero cuando configura todo module.exports
en realidad crea un nuevo objeto al que el módulo requerido no tiene forma de acceder.
Mientras que node.js permite circular require
dependencias, ya que ha descubierto que puede ser bastante desordenado y probablemente sea mejor reestructurar su código para no necesitarlo. Tal vez cree una tercera clase que use las otras dos para lograr lo que necesita.
[EDIT] no es 2015 y la mayoría de las bibliotecas (es decir, Express) han realizado actualizaciones con mejores patrones, por lo que las dependencias circulares ya no son necesarias. recomiendo simplemente no usarlos.
Sé que estoy desenterrando una respuesta anterior aquí … El problema aquí es que module.exports está definido después necesita ClaseB. (que muestra el enlace de JohnnyHK) Las dependencias circulares funcionan muy bien en Node, simplemente se definen sincrónicamente. Cuando se usan correctamente, en realidad resuelven muchos problemas comunes de los nodos (como acceder a express.js app
de otros archivos)
Solo asegúrese de que sus exportaciones necesarias estén definidas antes de necesita un archivo con una dependencia circular.
Esto se romperá:
var ClassA = function();
var ClassB = require('classB'); //will require ClassA, which has no exports yet
module.exports = ClassA;
Esto funcionará:
var ClassA = module.exports = function();
var ClassB = require('classB');
Uso este patrón todo el tiempo para acceder a express.js app
en otros archivos:
var express = require('express');
var app = module.exports = express();
// load in other dependencies, which can now require this file and use app