노드 매뉴얼에서 나는로 파일의 디렉토리를 얻을 수 있음을 __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();
또는 @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();