Node __dirname не определено

В руководстве node я вижу, что я могу получить каталог файла с __dirname, но из REPL это выглядит как undefined. Это недоразумение на моей стороне или где ошибка?

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

Ответ 1

__dirname определяется только в сценариях. Он не доступен в REPL.

попробуйте сделать script a.js

console.log(__dirname);

и запустите его:

node a.js

вы увидите __dirname.

Добавленное описание фона: __dirname означает "Каталог этого script". В REPL у вас нет script. Следовательно, __dirname не имеет никакого реального значения.

Ответ 2

Основываясь на существующих ответах здесь, вы можете определить это в своем REPL:

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

Или:

__dirname = path.resolve();

Если сегменты пути не пройдены, path.resolve() вернет абсолютный путь к текущему рабочему каталогу.


Или альтернативы @Jthorpe:

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

Ответ 3

Как сказал @qiao, вы не можете использовать __dirname в реплике node. Однако, если вам нужно это значение в консоли, вы можете использовать path.resolve() или path.dirname(). Хотя path.dirname() просто даст вам "." поэтому, возможно, не так полезно. Обязательно require('path').

Ответ 4

Хотя это не решение этой проблемы, я хотел бы добавить ее, поскольку она может помочь другим.

У вас должно быть два символа подчеркивания перед именем dirname, не одним нижним числом (__dirname not _dirname).

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

Ответ 5

Похоже, вы тоже можете это сделать:

__dirname=fs.realpathSync('.');

конечно, не забывайте fs=require('fs')

(он не является действительно глобальным в node сценариях точно, его только что определен на уровне модуля)