如何解决Node中的循环依赖问题

3

我遇到了一些错误,比如“Type变量未定义”和“getLastUnknownAlbumTrackNumber不是一个函数”。

我安装了madge来检查循环依赖,但我不知道该如何解决它们。

以下是madge的输出:

const madge = require('madge');

madge('./server.js').then((res) => {
    console.log(res.circular());
});

OUTPUT:
(node:6960) Warning: Accessing non-existent property 'getLastUnknownAlbumTrackNumber' of module exports inside circular dependency
(node:6960) Warning: Accessing non-existent property 'Type' of module exports inside circular dependency
[
[ 'jobs/index.js', 'models/index.js' ],
[ 'models/index.js', 'services/metadata.js' ]
]

以下是相关的导入和导出:
导入:jobs/index.js
const { getMovieMetaData, getTVShowMetaData, getAlbumMetaData } = require('../models');
...
module.exports = { getAll, upsertAll, getLastUnknownAlbumTrackNumber }

services/metadata.js

const { Type } = require('../models');
...
module.exports = Metadata

models/index.js

const { getLastUnknownAlbumTrackNumber } = require('../jobs');
const metadataServiceConstructor = require('../services/metadata');
const metadataService = new metadataServiceConstructor()
...
module.exports = { Type, getMovieMetaData, getTVShowMetaData, getAlbumMetaData }

1
工作包括模型,其中包括工作。这就是你的循环依赖。在Node.js中无法这样做。重构代码,将共同的部分移动到一个第三方模块中,这样这两个模块就可以互相引用而不会相互包含。在这里使用madge毫无意义。现在你知道了循环依赖的位置 - 重构代码来修复它。 - undefined
哦,而且模型包括元数据,其中也包括模型。这也做不到。 - undefined
2个回答

1

你希望发生什么?尝试解决循环导入会导致无限递归。

即使你使用这个工具来检查循环导入,它也不是静态分析,因此代码仍然需要运行,所以你会遇到同样的问题。

顺便说一下,你为什么要使用这个工具呢?循环导入的位置很明显。你需要重构以避免这种情况。


0

初次阅读,这个答案可能看起来有点神秘。

这是由于“循环依赖”的本质所致。

一旦你理解了它,修复你的解决方案也将变得容易。

问题:

1.js -> 2.js -> 3.js
                3.js -> 4.js -> 2.js ( `cycle` )

解决方案:

1.js -> 2.js `(remove connection)`
               3.js -> 4.js -> 2.js
1.js -> `200.js (add new)` -> 3.JS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接