对象不是函数 - 带Param的模块

时间:2015-07-26 07:41:24

标签: node.js

我正在尝试使用节点模块注入网关。不确定我是否可以这样做,因为我在'object is not a function error'

行上找到了var response = new controller(gateway).find();

或者我应该能够通过节点模块来做到这一点,但是没有做到这一点。

注意:虽然控制器中的代码尚未使用网关,但我希望能够立即注入它,以确保我能够。

someFile.js

var controller = require('someController');
var gateway = require('someGateway);

var response = new controller(gateway).find();

someGateway.js

'use strict';

module.exports = function(){
    var _data;

    return {
        data: function(someData){
            _data = someData;
        },
        find: function(){
            return _data;
        }
    };
}();

someController.js

'use strict';

module.exports = function(gateway){

    var _gateway = gateway;

    return {
        find: function(searchText){

            var response = {};

            if(typeof searchText === "undefined"){
                response.statusCode = 400;
            }

            return response;
        }
    };
}();

已更新

我尝试将其更改为:

someFile.js

var controller = require('someController');

var response = controller.find();

someControllerjs

'use strict';

var Controller = function(){

    var _find = function(searchText){
        var response = {};

        if(typeof searchText === "undefined"){
            response.statusCode = 400;
        }

        return response;
    };

    return {
        find: _find
    };

}();

module.exports = Controller;

我正在尝试使用这个家伙的模式,但我仍然得到同样的错误。 http://rob.conery.io/2012/02/25/testing-your-model-with-mocha-mongo-and-nodejs/

1 个答案:

答案 0 :(得分:0)

我并非100%确定您正在尝试使用此代码实现的目标,但也许我可以了解正在发生的事情:)

  1. var gateway = require('someController');
  2. 你要求Node.js加载一些名为“someController”的模块。它会找到someController.js并开始执行文件。

    1. module.exports = function(gateway){ ... }();
    2. 立即调用此函数(作为IIFE),并且从它返回的任何内容都被指定为"输出"那个模块。在函数中,使用find方法返回普通对象。

      在内存中,controller现在等于此对象:

      {
          find: function(searchText){
      
              var response = {};
      
              if(typeof searchText === "undefined"){
                  response.statusCode = 400;
              }
      
              return response;
          }
      };
      
      1. var response = new controller(gateway).find();
      2. 您在上面的对象上调用new,并尝试将其作为函数调用。 但是,它是一个对象。您无法调用controller(gateway)因为控制器只等于一个对象。因此,您会收到您提到的错误。

        我认为您可能会意外地尝试将功能分配给module.exports,而不是IIFE。请记住,每个模块末尾的括号(}();)会导致函数立即执行,并将结果值设置为模块的值。尝试删除模块末尾的函数调用括号,你应该有更好的运气!