解决NodeJS模型中的循环依赖

Kou*_*sha 1 node.js bookshelf.js

我有两个模型(使用BookshelfJS,或BackboneJS,无所谓): ,.modelA 要求和要求.modelBmodelAmodelBmodelBmodelA

最初,我有:

// 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;
Run Code Online (Sandbox Code Playgroud)

然后我在这里读到关于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);
Run Code Online (Sandbox Code Playgroud)

在情况1中,存在循环依赖性,其在情况2中被修复.但是现在在情况2中,当modelA被引导时,modelB尚未定义,因此Bookshelf.model('modelB')不存在.

我该怎么办?

Kou*_*sha 6

好的,所以修复非常简单.这是任何有兴趣的人.将使用它的函数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
    }
});
Run Code Online (Sandbox Code Playgroud)

问题是在modelB引导时modelA没有引导.modelB然后不可能要求页面顶部.相反,你需要在函数内部.到那时,您的应用程序正在运行,所有内容都已自举.