必要时,节点模块未定义

时间:2016-02-07 07:24:39

标签: javascript node.js module

当我尝试要求节点模块时,我遇到了一个非常奇怪的错误。为了说明这里的问题,我想要的代码是:

module.exports = (function(){
  this.say = function(message) {
    console.log(message);
  }
})();

现在,当我需要这个模块时,当我尝试按以下方式使用时,我得到'无法读取属性'说'undefined':

var person = require('./Person.js')
person.say('Hello World!');

然而,如果我按如下方式定义模块,它可以正常工作......

module.exports = {
    say : function(message) {
       console.log(message);
    }
};

我甚至试过这种符号也有用......

module.exports = new Person();
function Person(){
  this.say = function(message) {
    console.log(message);
  }
};

有没有人知道为什么第一种表示法不能正常工作?

2 个答案:

答案 0 :(得分:1)

原因是你的第一个符号并没有返回任何要导出的东西。

module.exports = (function(){
  this.say = function(message) {
    console.log(message);
  }
  return this;
})();

我想这可以解决你的问题。

答案 1 :(得分:0)

module.exports是一个对象,将在require调用该文件时返回。 所以假设您想要编写一个执行某些逻辑的库,一些是私有的,另一些是公共的。 并且您希望仅将您的公共函数公开给其他人来调用, 您的文件可能是:

// Some require calls you maybe using in your lib
function privateFunc(s) {
  console.log(s);
}

function publicFunc(s) {
  privateFunc("new log: " + s);
}

module.exports = {
  log: publicFunc
}

您稍后将按如下方式使用它:

var logger= require('myLib');
logger.log("my log");

这将输出:

new log: my log

这可能比你真正想要的更深,但它意味着理解事物的流动