2010-11-30 11 views
9

के भीतर से module.exports जाओ एक फाइल में मैं इस कोड है।एक ही फाइल

मुझे लगा कि यह काम करेगा:

this.greet() 

लेकिन ऐसा नहीं किया।

मुझे संदर्भ का क्या संदर्भ है?

+0

बस पूछना चाहता था कि पर्यावरण के बारे में मेरा जवाब आपके लिए सहायक था या नहीं, अन्यथा यह एक बग हो सकता है जिसे दायर किया जाना चाहिए :) –

उत्तर

11

आम तौर पर, यह ठीक काम करना चाहिए, लेकिन देखते हैं कि यह क्यों विफल हो सकता है।

कुछ पृष्ठभूमि पहले
क्या होता है कि exports एक वस्तु है कि, require, module, __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.fooexports ऑब्जेक्ट पर कोई भी संपत्ति सेट नहीं करेगा।

देखें: 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 में है प्रभाव, export NODE_MODULE_CONTEXTS=1; जैसे कुछ के लिए आपको अपने ~/.bashrc और ~/.bash_profile फ़ाइलों की जांच करने की आवश्यकता है और इसे हटा दो।

एक नया टर्मिनल खोलना सुनिश्चित करें, क्योंकि उन दो फ़ाइलों को बदलने के बाद केवल तभी पढ़ा जाता है जब कोई बनाया जाता है।

संबंधित मुद्दे