解决NodeJS模型中的循环依赖

时间:2015-03-13 01:25:39

标签: node.js bookshelf.js

我有两个模型(使用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;

然后我读了关于Bookshelf.plugin('register')的{​​{3}}。所以我将代码更改为:

// 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尚未定义,因此{{1不存在。

我该怎么办?

2 个答案:

答案 0 :(得分:5)

好的,所以修复非常简单。这是任何有兴趣的人。 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没有被引导。然后,不可能要求页面顶部的{{1}}。相反,你需要在函数内部。到那时,您的应用程序正在运行,所有内容都已自动启动。

答案 1 :(得分:0)

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

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 };