2010-11-30 59 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;和 去掉它。

請確保打開一個新的終端,因爲更改這兩個文件只有在創建時纔讀入。