从节点手册中,我看到我可以用__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)
在现有答案的基础上,你可以在你的REPL中定义这个:
__dirname = path.resolve(path.dirname(''));
Or:
__dirname = path.resolve();
如果没有传递路径段,path.resolve()将返回当前工作目录的绝对路径。
或者@Jthorpe的替代方案:
__dirname = process.cwd();
__dirname = fs.realpathSync('.');
__dirname = process.env.PWD
我以SYSTEM用户从批处理文件运行一个脚本,所有变量如process.cwd(), path.resolve()和所有其他方法都会给我C:\Windows\System32文件夹的路径,而不是实际的路径。在实验过程中,我注意到当抛出错误时,堆栈中包含节点文件的真实路径。
这里有一个非常简单的方法,通过触发错误并从e.stack中提取路径来获得真正的路径。不要使用。
// this should be the name of currently executed file
const currentFilename = 'index.js';
function veryHackyGetFolder() {
try {
throw new Error();
} catch(e) {
const fullMsg = e.stack.toString();
const beginning = fullMsg.indexOf('file:///') + 8;
const end = fullMsg.indexOf('\/' + currentFilename);
const dir = fullMsg.substr(beginning, end - beginning).replace(/\//g, '\\');
return dir;
}
}
使用
const dir = veryHackyGetFolder();