使用require throws可能失败的依赖注入不是一个功能'错误

时间:2017-08-21 14:53:03

标签: javascript node.js dependency-injection

我已经查看了与此错误相关的几个问题,而且大多数问题似乎都误解了关键字this的含义。我不认为我在这里有这个问题。我可能是某种循环依赖问题,我无法很好地表达出来以便自己解决这个问题。

我试图将我的问题提炼成下面的三个文件。

something.js

var A = require('../lib/a');

var Something = function (type) {
    this.type = type;
};

Something.prototype.setTemplate = function (template) {
    this.template = template;
};

Something.prototype.applyTemplate = function () {
    var templateResult = this.template.calculate();
};


var factory = {};

factory.createSomething = function(type) {
    return new Something(type);
};

factory.createA = function (input) {
    return A.Make(input);
};

module.exports = factory;

a.js

var S = require('../prof/something');
var _ = require('underscore');

var A = function (input) {
    this.input = input;
};

A.prototype.calculate = function () {
    var calculation = 0;
    var _s = S.createSomething('hello world');
    // do calculation using input
    return calculation;
};

var factory = {};

factory.Make = function (input) {
    var a = new A(input);
    return a;
};

module.exports = factory;

a_test.js

describe('Unit: A Test', function() {

    var S = require('../prof/something');

    it('test 1', function() {
        var a = S.createA({
            //input
        });

        var s = S.createSomething('type1');

        s.setTemplate(a);
        s.applyTemplate(); // error
    });
});

错误从评论a_test.js的行//error的顶层开始抛出。在最低级别,'不是一个功能' a.js方法在S.createSomething(type)中抛出错误。它说S.createSomething()不是函数。

我在该行放置了一个断点,并尝试从下划线库中调用函数,但它给出了相同的错误。所以似乎a.js中的require语句不会抛出错误,但是没有一个注入的对象可以用来调用函数。正在使用karma库运行a_test.js文件。

我是否通过在A和S之间来回引用来违反某些javascript范例?我该怎么做呢?

编辑:我已经做了一些进一步的测试。如果测试文件看起来像这样,实际上并不重要:

describe('Unit: A Test', function() {

    var S = require('../prof/something');

    it('test 1', function() {
        var a = S.createA({
            //input
        });
        a.calculate(); // error
    });
});

上述行仍然会出现错误。

1 个答案:

答案 0 :(得分:0)

问题中的文件互相引用。这称为循环依赖。解决方案是将var S = require('../prof/something');语句移动到calculate函数中,如下所示:

a.js

// move the line from here
var _ = require('underscore');

var A = function (input) {
    this.input = input;
};

A.prototype.calculate = function () {
    var S = require('../prof/something'); // to here
    var calculation = 0;
    var _s = S.createSomething('hello world');
    // do calculation using input
    return calculation;
};

var factory = {};

factory.Make = function (input) {
    var a = new A(input);
    return a;
};

module.exports = factory;