2012-01-11 109 views
69

從節點手冊我看到,我可以得到__dirname文件的目錄,但從REPL這似乎是未定義的。這是我的誤解還是錯誤?節點__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僅在腳本中定義。它在REPL中不可用。

嘗試使腳本a.js

console.log(__dirname); 

並運行它:

node a.js 

你會看到__dirname打印。

添加背景說明:__dirname表示'此腳本的目錄'。在REPL中,你沒有腳本。因此,__dirname沒有任何實際意義。

+4

你也不能使用一些內幕RequireJS模塊的全局變量。如果您在服務器端使用RequireJS,請參閱http://stackoverflow.com/questions/9027429/how-to-use-nodejs-global-module-objects-in-requirejs-modules。 – Eye 2012-11-05 08:25:04

+0

是的,這應該真的被添加到答案眼睛,因爲這是什麼讓我。 – 2015-10-12 17:14:01

+2

不將它添加到REPL的加載腳本是令人討厭的。我想不出任何原因,它不會在那裏...... – jcollum 2015-11-18 21:16:14

5

正如@qiao所說,你不能在節點repl中使用__dirname。但是,如果您需要在控制檯中使用此值,則可以使用path.resolve()path.dirname()。雖然,path.dirname()只會給你一個「。」所以,可能沒有那麼有用。一定要require('path')

45
現有答案

大廈在這裏,你可以在你的REPL定義是:

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

或者:

__dirname = path.resolve(); 

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


或@ Jthorpe的人ternatives:

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

如果你使用'nesh',你可以將它定義爲你的加載腳本的一部分;它很漂亮 – jcollum 2015-11-18 21:15:03

+1

或'__dirname = process.cwd()'或'__dirname = fs.realpathSync('。')'或'__dirname = process.env.PWD' – Jthorpe 2016-04-06 04:31:47

+1

'path.dirname'似乎不接受非字符串值在最新的主版本「6.0.0」中,所以這個答案中的第一個建議將不起作用。 – trysis 2016-06-16 15:22:19

2

好像你也可以這樣做:

__dirname=fs.realpathSync('.'); 
當然

,不要忘記fs=require('fs')

(它不是一個真正全球性的節點腳本準確地說,它只是在模塊中定義水平)

2

雖然它不是解決這個問題,我想補充它,因爲它可能會幫助其他人。

你應該有兩個下劃線目錄名稱之前,不是一個undersore__dirname不_dirname)。

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

+0

__dirname(帶兩個下劃線)在REPL中不起作用 – 2018-02-25 10:32:39