解决 NodeJS 模型中的循环依赖
Resolving Circular Dependency in NodeJS model
我有两个模型(使用 BookshelfJS 或 BackboneJS,都无所谓):modelA
、modelB
。 modelA
需要 modelB
而 modelB
需要 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 };
我有两个模型(使用 BookshelfJS 或 BackboneJS,都无所谓):modelA
、modelB
。 modelA
需要 modelB
而 modelB
需要 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 };