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



`我收到了一些错误,比如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 }

您预计会发生什么?试图解析循环导入会导致无限递归。

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

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

乍一看,这个答案可能有点神秘
这是由于cyclic dependency的性质。

一旦你理解了它,它将很容易修复你的解决方案太

问题:

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

最新更新