我正在尝试使用节点模块注入网关。不确定我是否可以这样做,因为我在'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/
答案 0 :(得分:0)
我并非100%确定您正在尝试使用此代码实现的目标,但也许我可以了解正在发生的事情:)
var gateway = require('someController');
你要求Node.js加载一些名为“someController”的模块。它会找到someController.js
并开始执行文件。
module.exports = function(gateway){ ... }();
立即调用此函数(作为IIFE),并且从它返回的任何内容都被指定为"输出"那个模块。在函数中,使用find
方法返回普通对象。
在内存中,controller
现在等于此对象:
{
find: function(searchText){
var response = {};
if(typeof searchText === "undefined"){
response.statusCode = 400;
}
return response;
}
};
var response = new controller(gateway).find();
您在上面的对象上调用new
,并尝试将其作为函数调用。 但是,它是一个对象。您无法调用controller(gateway)
因为控制器只等于一个对象。因此,您会收到您提到的错误。
我认为您可能会意外地尝试将功能分配给module.exports
,而不是IIFE。请记住,每个模块末尾的括号(}();
)会导致函数立即执行,并将结果值设置为模块的值。尝试删除模块末尾的函数调用括号,你应该有更好的运气!