2012-01-11 30 views
69

नोड मैनुअल से मुझे लगता है कि मैं __dirname के साथ फ़ाइल की निर्देशिका प्राप्त कर सकता हूं, लेकिन आरईपीएल से यह अपरिभाषित प्रतीत होता है। क्या यह मेरी तरफ एक गलतफहमी है या त्रुटि कहां है?नोड __dirname परिभाषित नहीं किया गया

$ node 
> console.log(__dirname) 
ReferenceError: __dirname is not defined 
    at repl:1:14 
    at REPLServer.eval (repl.js:80:21) 
    at Interface.<anonymous> (repl.js:182:12) 
    at Interface.emit (events.js:67:17) 
    at Interface._onLine (readline.js:162:10) 
    at Interface._line (readline.js:426:8) 
    at Interface._ttyWrite (readline.js:603:14) 
    at ReadStream.<anonymous> (readline.js:82:12) 
    at ReadStream.emit (events.js:88:20) 
    at ReadStream._emitKey (tty.js:320:10) 

उत्तर

112

__dirname केवल स्क्रिप्ट में परिभाषित किया गया है। यह आरईपीएल में उपलब्ध नहीं है।

एक स्क्रिप्ट a.js

console.log(__dirname); 

बनाने के लिए प्रयास करें और इसे चलाने:

node a.js 

आप __dirname देखेंगे छपी।

जोड़ा गया पृष्ठभूमि स्पष्टीकरण: __dirname का अर्थ है 'इस स्क्रिप्ट की निर्देशिका'। आरईपीएल में, आपके पास एक स्क्रिप्ट नहीं है। इसलिए, __dirname का कोई वास्तविक अर्थ नहीं होगा।

+4

इसके अलावा, आप RequireJS मॉड्यूल के अंदर वैश्विक चर से कुछ का उपयोग नहीं कर सकते। यदि आप सर्वर पक्ष पर RequJS का उपयोग करते हैं, तो http://stackoverflow.com/questions/9027429/how-to-use-nodejs-global-module-objects-in-requirejs-modules देखें। – Eye

+0

हाँ, इसे वास्तव में उत्तर आई में जोड़ा जाना चाहिए, क्योंकि यही मुझे मिला है। –

+2

यह नहीं जोड़ रहा कि आरईपीएल की लोड स्क्रिप्ट में अप्रिय है। मैं किसी भी कारण से नहीं सोच सकता कि यह वहां नहीं होगा ... – jcollum

5

जैसा कि @qiao ने कहा, आप नोड प्रतिकृति में __dirname का उपयोग नहीं कर सकते। हालांकि, अगर आपको कंसोल में इस मान की आवश्यकता है, तो आप path.resolve() या path.dirname() का उपयोग कर सकते हैं। हालांकि, path.dirname() आपको बस "।" देगा तो, शायद वह सहायक नहीं है। require('path') सुनिश्चित करें। Jthorpe के

__dirname = path.resolve(); 

If no path segments are passed, path.resolve() will return the absolute path of the current working directory.


या @:

45
मौजूदा जवाब पर

बिल्डिंग यहां आपने अपने आरईपीएल में यह निर्धारित कर सकते हैं:

__dirname = path.resolve(path.dirname('')); 

या अल ternatives:

__dirname = process.cwd(); 
__dirname = fs.realpathSync('.'); 
__dirname = process.env.PWD 
+0

के भीतर से उपलब्ध नहीं है यदि आप 'nesh' का उपयोग करते हैं तो आप इसे अपनी लोड स्क्रिप्ट के हिस्से के रूप में परिभाषित कर सकते हैं; यह निफ्टी – jcollum

+1

या '__dirname = process.cwd()' या '__dirname = fs.realpathSync ('।')' या '__dirname = process.env.PWD' – Jthorpe

+1

' path.dirname' गैर-स्ट्रिंग मान स्वीकार नहीं करता है अब नवीनतम संस्करण, '6.0.0' में, इसलिए इस उत्तर में पहला सुझाव काम नहीं करेगा। – trysis

2

लगता है जैसे आप भी ऐसा कर सकता है:

__dirname=fs.realpathSync('.'); 
निश्चित रूप से

, न भूल fs=require('fs')

(यह वास्तव में वैश्विक नोड लिपियों में बिल्कुल नहीं है, इसकी सिर्फ मॉड्यूल पर परिभाषित स्तर)

2

हालांकि इस समस्या का समाधान नहीं है, लेकिन मैं इसे जोड़ना चाहता हूं क्योंकि इससे दूसरों की मदद मिल सकती है।

आप dirname से पहले दो सुप्तविराम होने चाहिये, नहीं एक undersore (__dirname _dirname नहीं)।

http://nodejs.org/docs/latest/api/globals.html#globals_dirname

+0

__dirname (दो अंडरस्कोर के साथ) REPL में काम नहीं करता है –

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