Импортированный модуль не определен, когда существует круговая зависимость между модулями, когда один модуль находится в родительском каталоге другого модуля. - PullRequest
0 голосов
/ 14 января 2019

структура файла

-src
--Visitor
---visitor.model.js
---Sessions
----session.model.js

В файле visitor.model.js

const {Sessions} = require('./Sessions/session.model');
const Visitor = {};

Visitor.visitorFunc = () => {


}

Sessions.sessionFunc();

module.exports = {Visitor: Visitor};

В файле session.model.js

const {Visitor} = require('../visitor.model.js');

const Session = {};

Sessions.sessionFunc = () => {

}

Visitor.visitorFunc();

module.exports = {Session: Session};

когда я делаю такой импорт в файле посетителя, сессия не определена. Какова причина этого .. Это вызывает импорт рекурсивно?

Ответы [ 3 ]

0 голосов
/ 14 января 2019

Круговые зависимости разрешены в узле

https://nodejs.org/api/modules.html#modules_cycles

Когда main.js загружает a.js, тогда a.js, в свою очередь, загружает b.js. В этот момент b.js пытается загрузить a.js. Чтобы предотвратить бесконечный цикл, незаконченная копия объекта экспорта a.js возвращается в модуль b.js. Затем b.js заканчивает загрузку, и его объект экспорта передается в модуль a.js.

Поскольку Session и Visitor звучат как модели баз данных с циклическими зависимостями M: N, то есть путь (например, запрос соединения)

Как работать с циклическими зависимостями в Node.js

Node.js Module.Exports Неопределенный пустой объект

Но было бы менее грязно избегать их, если бы вы могли.

0 голосов
/ 14 января 2019

Как @prashand выше объяснил причины, по которым вам нужно было бы выполнять импорт и вызывать импортированные функции после экспорта текущего модуля. Приведенный выше пример работает с небольшим изменением следующим образом

const Visitor = {};

Visitor.visitorFunc = () => {

  console.log('hello from visitor model');
}


module.exports = {Visitor: Visitor};
// import session.model after exporting the current module

const {Session} = require('./Sessions/session.model');

// then call the required function
Session.sessionFunc();
0 голосов
/ 14 января 2019

Ваш файл visitor.model.js находится вне каталога Sessions. Для импорта session.model.js вам нужно указать абсолютный путь к этому файлу. Таким образом, ваше требование требует быть таким

const { Sessions } = require('../Sessions/session.model.js');
...