[node.js] __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()현재 작업 디렉토리의 절대 경로를 리턴합니다.


또는 @Jthorpe의 대안 :

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


답변

ES6에서는 다음을 사용하십시오.

import path from 'path';
const __dirname = path.resolve();

노드를 호출 할 때도 사용 가능 --experimental-modules


답변

@ qiao가 말했듯 __dirname이 노드 repl 에서는 사용할 수 없습니다 . 그러나 콘솔에서이 값이 필요한 경우 path.resolve()또는 을 사용할 수 있습니다 path.dirname(). 그러나 path.dirname()“.”만 줄 것입니다. 아마 도움이되지 않을 것입니다. 꼭하세요 require('path').


답변

당신도 이것을 할 수있는 것 같습니다 :

__dirname=fs.realpathSync('.');

물론 잊지마 fs=require('fs')

(실제로는 노드 스크립트에서 전역 적이 지 않으며 모듈 수준에서 정의되었습니다)


답변

나는 또한 사용하여 내 길에 합류하려고했습니다. path.join(__dirname, 'access.log') 했지만 동일한 오류가 발생했습니다.

내가 고 쳤던 방법은 다음과 같습니다.

먼저 경로 패키지를 가져 와서 라는 변수를 선언 한 __dirname다음 경로 를 호출했습니다.resolve 메소드 .

CommonJS에서

var path = require("path");

var __dirname = path.resolve();

ES6 +에서

import path  from 'path';

const __dirname = path.resolve();

행복한 코딩 …….


답변

배치 파일에서 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();