2012-01-11 110 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