从同一个文件中获取module.exports
在一个文件中我有这样的代码:
module.exports.greet = function() {...}
我想在同一个文件中使用这个函数。
我认为这将工作:
this.greet()
但事实并非如此。
什么是我必须使用的参考?
通常情况下,这应该工作得很好,但让我们看看为什么这可能会失败。
首先是一些背景
会发生什么是exports
是一个对象,除了像require
, module
, __dirname
等一些其他东西,被传递到包装模块内容的闭包,然后exports
由require()
返回。
请参阅: https : //github.com/ry/node/blob/master/src/node.js#L327
this
模块里面的模块引用了exports
对象,然后module
对象持有对这个exports
对象的引用。 模块内部的名称空间通过闭包提供。
最后还有提供全局名称空间和托pipeprocess
的global
对象。
例子
// main.js this.bla = function(){} // sets bla on the the exports object require('./sub'); console.log(this); // { bla: [Function] } console.log(exports); // { bla: [Function] } console.log(module); /* { id: '.', exports: { bla: [Function] }, parent: undefined, filename: '/home/ivo/Desktop/main.js', loaded: false, exited: false, children: [] } */ // sub.js this.greet = function() {} // sets greet on the exports object console.log(this); // { greet: [Function] } console.log(exports); // { greet: [Function] } console.log(module); /* { id: './sub', exports: { greet: [Function] }, parent: { id: '.', exports: { bla: [Function] }, parent: undefined, filename: '/home/ivo/Desktop/main.js', loaded: false, exited: false, children: [] }, filename: '/home/ivo/Desktop/sub.js', loaded: false, exited: false, children: [] } */
问题的原因
您的代码不起作用的唯一解释是环境variablesNODE_MODULE_CONTEXTS
被设置为大于零的整数。
在这种情况下,模块可以在自己的上下文中运行。 this
主模块内部现在将引用global
对象和内部子模块,它将引用一个沙箱对象。 因此this.foo
不会在exports
对象上设置任何属性。
请参阅: https : //github.com/ry/node/blob/master/src/node.js#L98
并且: https : //github.com/ry/node/blob/master/src/node.js#L296
解决问题
您可以检查传递给节点进程的环境variables:
console.log(process.env); // get a list of all variables // get just the one that's causing trouble, if this returns a number > 0 then it's in effect console.log(process.env['NODE_MODULE_CONTEXTS']);
如果NODE_MODULE_CONTEXTS
有效,你需要检查你的~/.bashrc
和~/.bash_profile
文件,如export NODE_MODULE_CONTEXTS=1;
并删除它。
确保打开一个新的terminal,因为修改这两个文件只有在创build时才被读入。