2016-07-31 69 views
0

我有一些ExpressJS路线这行代码:出口的NodeJS功能上需要

var test = require('../app/test')('dev'); 
test.getData(); //this fails saying: typeError getData() is not a function 

我的测试文件看起来像这样:

module.exports = function(env){ 

    var mod = { 
    'field1': 'asd', 
    'field2': 'asd2' 
}; 

mod.getData = function(){ 
    return 'data'; 
}; 

return mod; 
}; 

我在做什么错?

+0

只需返回'mod'。 '返回mod'。另外'mod.getData()= function(){'应该是mod。getData = function(){' – undefined

+0

是的,错字抱歉,结果相同。 – mdv

+0

你能发表更多的代码吗?也许你的整个项目在zip文件? –

回答

2

2误区:

1/

可以定义filed1 &当你打电话给你使用field1==>键入错误

2/

你需要写你的包返回对象,其具有属性getData这是另一个function像下面这样:

module.exports = function(env){ 

    var mod = { 
    'filed1': 'asd', 
    'field2': 'asd2', 
    'getData' :function(){ 

     return 'data'; 
    } 
}; 

return mod ; 


}; 

解释:

  • require('../app/test')回报function(env){ ....
  • require('../app/test')('dev')呼叫function(env){....}('dev') ==>它返回的function(env){....输出。

  • 此输出应是一个对象(mod),它包含作为属性getData &其值应的功能,能够调用require('../app/test')('dev').getData()


DEMO:

test=function(env){ 
 

 
    var mod = { 
 
    'filed1': 'asd', 
 
    'field2': 'asd2', 
 
    'getData' :function(){ 
 
    
 
     return 'data'; 
 
    } 
 
    }; 
 
    
 
return mod ; 
 

 

 
}; 
 

 
    console.log(`Can i call "test.getData()" ?`) 
 
try{ 
 
    test('dev').getData(); //!--- Call like this 
 
    console.log('yes') 
 
}catch(e){ 
 

 
    console.log('No : ',e) 
 
} 
 
    
 
console.log(`Can i call "test('dev').filed1" ? => `,test('dev').filed1 ==='asd');

+0

但是这样我就失去了mod数据。 – mdv

+0

@mdv:不,它可以从getData函数访问..你不会丢失IT –

+1

但是如果来自外部,我想使用test.field1 // asd和test.getData()? – mdv

-1

这是完整的源代码。

test.js:

module.exports = function(env){ 

    var mod = { 
    'filed1': 'asd', 
    'field2': 'asd2', 
    'somefunction' : function() { 


    return 'data'; 

    } 
    }; 


    return mod; 
}; 

index.js

var test = require('../test'); 
test().somefunction(); 

问题是你试图访问该对象的属性调用的getData。 getData已经被定义为mod对象的一个​​属性。所以如果你想访问它,你需要删除括号。 test.getData就足够了。但是,getData被定义为一个函数。 另外test.js被导出为函数。所以你需要访问test()然后通过getData()调用test()中的函数;

+1

'test.somefunction'不会调用赋给属性'somefunction'的函数,它只会访问它。你总是需要括号来调用一个函数(除非你为这个属性定义了一个getter或者setter函数)。该错误表示存储在属性'somefunction'中的值不是函数。 –

+0

你说得对。我设法修复错误信息,但是我没有测试以确保函数实际被调用。我将编辑我的帖子。 –