2010-11-30 57 views
9

内获取module.exports在一个文件中我有这样的代码:从同一文件

module.exports.greet = function() {...} 

我想使用该功能从同一个文件中。

我想这会工作:

this.greet() 

但事实并非如此。

什么是我必须使用的参考?

+0

只是想问我的关于环境变量的回答是否对你有帮助,否则这可能是一个错误应该提交:) – 2010-12-03 18:09:52

回答

11

通常,这应该工作得很好,但让我们看看为什么这可能会失败。

一些背景第一
什么情况是,exports的是,有一些其他的东西像requiremodule__dirname等一起,被传递到一个封装模块内容关闭对象,exports然后由require()返回。

参见:https://github.com/ry/node/blob/master/src/node.js#L327

this模块内部指exports对象,则module对象保存到exports对象的引用。模块内的名称空间通过闭包提供。

最后还有global对象,它提供全局名称空间并承载诸如process之类的东西。

例子

// 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: [] } */ 

问题
的事实,你的代码不工作是可变NODE_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

解决问题
您可以检查中通过了该节点过程中对环境变量:

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;和 去掉它。

请确保打开一个新的终端,因为更改这两个文件只有在创建时才读入。