解决NodeJS模型中的循环依赖问题
我有两个模型(使用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;
然后我在这里阅读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
在引导时没有引导。 因此,要求页面顶部的modelB
是不可能的。 相反,你需要在函数内部。 到那时,你的应用程序正在运行,所有的东西都被引导。