使用module.exports和exports时出错

时间:2017-07-09 03:59:25

标签: node.js commonjs

在发布此问题之前,我已在SO上阅读了几篇帖子。我不清楚的一件事是,为什么我在将其作为模块导入时无法使用乘法函数。不是module.exports和exports引用同一个对象吗?

不应该多次添加到module.exports引用的对象。由于exports是module.exports的别名,我原以为我正在添加多个相同的对象,因为我没有重新分配导出以引用其他内容。

module.exports = {
  sum : function(a,b){
    return a+b;
  }
};

exports.multiply = function(a,b){
  return a*b;
};

2 个答案:

答案 0 :(得分:1)

请注意,在每个nodejs模块文件的开头,export和module.exports都指向同一个空对象。您可以为它们分配属性,如下所示:

exports.item1 = "hi1"

module.exports.item2 = "hi2"

现在两个exports和module.exports都具有相同的值:

{item1:"hi1", item2: "hi2"}

但是当你为它们分配对象时,只有你给module.exports的对象很重要!在您的情况下,如果要将对象分配给module.exports然后向其添加其他函数,则应首先将同一对象分配给它们!现在,它们将指向同一个对象,如果您为export对象分配另一个函数,它也可以通过module.exports对象访问。

更改代码的第一行,它会正常工作!

exports = module.exports = {
    sum : function(a,b){
    return a+b;
    }
};

exports.multiply = function(a,b){
    return a*b;
};

答案 1 :(得分:0)

您无法访问乘法函数,因为javascript对象是通过引用传递的。当您使用行module.exports = {blah}时,您创建一个新对象{blah}并将module.exports设置为指向它。但是,出口仍然指向旧的对象。

最初,module.exports和exports指向同一个空对象。 因此,exports = {},module.exports = {}。但是当你创建一个新对象并让module.exports指向它时,例如:

((Xamarin.Forms.NavigationPage)MyProject.App.Current.MainPage).Pushed += (s, e) => 
{
    if (e.Page is ContentPage)
    {
        // Do what you gotta do
    }

    // or, for a specific page:
    if (e.Page is MyProject.Views.MyCustomPage)
    {
        // Do what you gotta do
    }
};

module.exports将指向新对象,但导出仍将指向旧对象:

module.exports = {
  sum : function(a,b){
    return a+b;
  }
};

然后:

// exports will still point to the old object
console.log(exports) // prints {}
console.log(module.exports) // prints { sum: function() }

导入模块时,会返回module.exports中的值,因此您无法访问乘法函数,因为它是在exports中定义的,它引用了不同的对象。

如果您不想担心此问题,可以这样做:

console.log(exports) // prints {}
exports.multiply = function(a,b){
    return a*b;
};
console.log(exports) // prints { multiply: function() }

这将使它们引用相同的对象。因此,

exports = module.exports = {
  sum : function(a,b){
    return a+b;
  }
};

将正常工作。