节点__dirname未定义

从节点手册我看到,我可以用__dirname获取文件的目录,但从REPL这似乎是未定义的。 这是我的误解还是错误?

 $ 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) 

__dirname仅在脚本中定义。 这在REPL中不可用。

尝试制作一个脚本a.js

 console.log(__dirname); 

并运行它:

 node a.js 

你会看到__dirname打印。

增加了后台说明: __dirname表示“这个脚本的目录”。 在REPL中,你没有脚本。 因此, __dirname没有任何实际意义。

基于现有的答案,你可以在你的REPL中定义这个:

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

要么:

 __dirname = path.resolve(); 

如果没有path段被传递,path.resolve()将返回当前工作目录的绝对path。


或@ Jthorpe的替代品:

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

正如@桥所说,你不能在节点repl中使用__dirname 。 但是,如果您需要在控制台中需要此值,则可以使用path.resolve()path.dirname() 。 虽然, path.dirname()只会给你一个“。” 所以,可能不是那么有用。 一定require('path')

虽然它不是解决这个问题的方法,但我想补充一点,因为它可以帮助别人。

在dirname之前应该有两个下划线而不是一个下划线__dirname不是_dirname)。

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

似乎你也可以这样做:

 __dirname=fs.realpathSync('.'); 

当然,不要忘记fs=require('fs')

(在节点脚本中并不是真的全局的,它只是在模块级定义的)