将“exports”分配给nodejs模块中的函数不起作用

时间:2014-03-12 21:44:23

标签: javascript node.js object express

在一个文件中(otherFile.js)我有这个:

exports = function() {}

在我的主文件中我有这个:

var thing = require('./otherFile.js');
new thing();

然而,这给了我以下错误:

TypeError: object is not a function

如果在otherFile.js中我改为:

exports.myFunction = function() {}

在我的主文件中我有这个:

var thing = require('./otherFile.js');
new thing.myFunction();

然后它完美地运作。为什么我不允许将函数分配给exports变量?

2 个答案:

答案 0 :(得分:2)

如果要更改导出的对象本身,则会将其分配给module.exports。这应该有效(在otherFile.js中):

module.exports = function() {}

详细说明原因:

重新分配变量不会改变之前引用的对象(这基本上就是你正在做的事情)。一个简单的例子就是:

function test(a) {
    a = { test: 'xyz' };
    console.log(a);
}

var x = { test: 'abc' };
test(x);

console.log(x);

基本上,通过为函数分配导出,您希望变量x的值为{ test: 'xyz' },但它仍然是{ test: 'abc' },因为该函数引入了一个新变量(它仍然引用相同的对象,但更改a.test将改变两者的输出)。这基本上是CommonJS模块(Node使用的)的工作原理。

答案 1 :(得分:0)

考虑以下代码:

!function(exports) {
    // your module code
    exports = 12345
}(module.exports)

console.log(module.exports)

它不会工作,很容易理解为什么。 Node.js exports对象的定义与此完全相同,除了参数排序。


所以始终使用module.exports代替exports,它会做正确的事。