Всем привет! Надеюсь я не ошибся разделом, нода хоть и нода но в неком смысле тоже яваскрипт) Помогите пожалуйста разобраться со странным (по крайней мере по сравнению с пыхом) поведением функции require в приложении. Ситуация следующая: есть node.js приложение со следующей структурой: в корне есть файл app.js, через который приложение запускается и две директории с модулями. В каждой директории есть конфигурационный файл модуля, подключаемый в файле самого модуля. Для наглядности попробую показать псевдографикой: Код (Text): +app.js | [module1]-----+config.js | +module1.js | [module2]-----+config.js +module2.js Теперь к проблеме: в процессе подключения и инициализации модулей конфиги затирают ранее подключенные, и в результате получается бред. Мне кажется что проблема связана с поведением require, но я не понимаю как ее исправить, опыта общения с node.js у меня не так много и с подобным сталкиваюсь в первый раз. Прилагаю код приложения: app.js Код (Text): let app = { services : {} }; async function bootstrap(app) { app.services.module1 = require('./module1/module1')(app); app.services.module2 = require('./module2/module2')(app); } bootstrap(app); config.js Код (Text): module.exports = { "dbHost" : "foo", "dbUser" : "bar", "dbPass" : "buz", "dbBase" : "blah" }; module(оба инициализируются практически одинаково, показываю на примере модуля 1) Код (Text): function Module1(app) { let self = this; self.app = app; self.config = require('./config'); self.init = async function() { self.db1 = new (require('./../database.js'))(); await self.db1.connect({ host : self.config.Db1Host, user : self.config.Db1User, password: self.config.Db1Pass, database: self.config.Db1Base }); self.db2 = new (require('./../database.js'))(); await self.db2.connect({ host : self.config.Db2Host, user : self.config.Db2User, password: self.config.Db2Pass, database: self.config.Db2Base }); }; self.init(); } module.exports = Module1; Расстановка console.log в обоих файлах показывает что у обоих модулей сначала подключаются свои конфиги (проверка вставка лога в условно 7-ю строку каждого модуля, для модуля 1 выводится конфиг модуля 1, а для модуля 2 конфиг модуля 2, но потом, если ввести еще один console.log в функцию инициализации второго модуля то он покажет что self.config переопределился и стал конфигом из первого модуля. WTF???)
Не затирает оно ничего, require один раз грузит модуль и затем его отдает везде где запрашивают. Очевидно, у вас где-то в коде теряется контекст и соответственно затирается.
Вы были правы! Контекст не то что теряется, он сливается воедино после первого коннекта к базе данных! 0_o Все методы и свойства модулей смешиваются и происходит переопределение конфигов. Остается только разобраться какого лешего это происходит, ведь контексты объектов нигде друг с другом не пересекаются, а класс database это просто промисифицированная обертка над mysql. Код (Text): const Mysql = require('mysql'); function DataBase() { let self = this; self.connection = null; self.connect = function(conParams) { return new Promise((resolve, reject) => { let connection = Mysql.createConnection(conParams); connection.connect((error) => { if (error) { reject(error); } else { self.connection = connection; resolve(); } }); }); } //code } module.exports = DataBase;
UPD: Допер наконец! Переделал app.js с: Код (Text): app.services.module1 = require('./module1/module1')(app); app.services.module2 = require('./module2/module2')(app); на: Код (Text): app.services.module1 = new (require('./module1/module1'))(app); app.services.module2 = new (require('./module2/module2'))(app); и все заработало как нужно.