当我尝试要求节点模块时,我遇到了一个非常奇怪的错误。为了说明这里的问题,我想要的代码是:
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);
}
};
有没有人知道为什么第一种表示法不能正常工作?
答案 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
这可能比你真正想要的更深,但它意味着理解事物的流动