解决 NodeJS 模型中的循环依赖

Resolving Circular Dependency in NodeJS model

我有两个模型(使用 BookshelfJS 或 BackboneJS,都无所谓):modelAmodelBmodelA 需要 modelBmodelB 需要 modelA

最初,我有:

// modelA
var Bookshelf = require('bookshelf);
var modelB = require('./modelB');
var modelA = Bookshelf.Model.extend({});

module.exports = modelA;

// modelB
var Bookshelf = require('bookshelf);
var modelA = require('./modelA);
var modelB = Bookshelf.Model.extend({});

module.exports = modelB;

然后我阅读了 here 关于 Bookshelf.plugin('register') 的内容。所以我将代码更改为:

// modelA
var Bookshelf = require('bookshelf);
var modelB = Bookshelf.model('modelB');
var modelA = Bookshelf.Model.extend({});

Bookshelf.model('modelA', modelA);

// modelB
var Bookshelf = require('bookshelf);
var modelA = Bookshelf.model('modelA');
var modelB = Bookshelf.Model.extend({});

Bookshelf.model('modelB', modelB);

在案例1中,有一个循环依赖,在案例2中修复了。但是现在在案例2中,当modelA被引导时,modelB还没有定义,所以Bookshelf.model('modelB') 不存在。

我该怎么办?

好的,所以修复非常简单。这是给任何有兴趣的人的。 require .extend({}) 函数中将使用它的模型。例如:

// modelA (which requires modelB somewhere inside)
var Bookshelf = require('bookshelf);
var modelA = Bookshelf.Model.extend({
    tableName : 'modelA',

    someFunc : function() {
        var modelB = Bookshelf.model('modelB'); 
        // Now use modelB here
    }
});

问题是 modelB 在引导 modelA 时没有引导。要求页面顶部的 modelB 是不可能的。相反,您需要在函数内部使用它。到那时,您的应用 运行 一切都已启动。

所以@Kousha 帮助我解决了内部需求 Bookshelf.Model.extend 我为每个 model/model 组创建一个文件然后导出模型的问题。所以我做了这个变体。

modelA.js

var modelA = Bookshelf.Model.extend({
    tableName : 'modelA',

    modelB() {
        this.belongsToMany(require('./modelB).modelB);
    }
});

module.exports = { modelA };

modelB.js

var modelB = Bookshelf.Model.extend({
    tableName : 'modelB',

    modelA() {
        this.belongsToMany(require('./modelA).modelA);
    }
});

module.exports = { modelB };