नोड __dirname परिभाषित नहीं है


138

नोड मैनुअल से मैं देखता हूं कि मैं एक फ़ाइल की निर्देशिका प्राप्त कर सकता हूं __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)


1
एस्लिंट का उपयोग करते समय मुझे यह मुद्दा मिला, मैंने अपने .eslintrc.json फ़ाइल के "browser": trueबजाय गलती से सेट कर दिया था "node": true
विवो सेवेन

जवाबों:


187

__dirnameकेवल लिपियों में परिभाषित किया गया है। यह आरईपीएल में उपलब्ध नहीं है।

एक स्क्रिप्ट बनाने की कोशिश करो a.js

console.log(__dirname);

और इसे चलाएं:

node a.js

तुम देखोगे __dirname मुद्रित ।

गयी पृष्ठभूमि की व्याख्या: __dirnameइसका अर्थ है 'इस लिपि की निर्देशिका'। REPL में, आपके पास कोई स्क्रिप्ट नहीं है। इसलिए, __dirnameइसका कोई वास्तविक अर्थ नहीं होगा।


5
इसके अलावा आप कुछ वैश्विक चर का उपयोग आवश्यकता के भीतर मॉड्यूल नहीं कर सकते हैं। यदि आप सर्वर पक्ष पर आवश्यकताएँ का उपयोग करते हैं, तो stackoverflow.com/questions/9027429/… देखें ।
आई

1
हाँ, यह वास्तव में उत्तर आई में जोड़ा जाना चाहिए, क्योंकि यही मुझे मिला है।
टॉम ज़ातो -

3
जोड़ना नहीं है कि REPL की लोड स्क्रिप्ट में अप्रिय है। मैं किसी भी कारण के बारे में सोच भी नहीं सकता ...
21

मैंने REPL का उपयोग करते हुए एक स्क्रिप्ट फ़ाइल लोड की .load script.js। यह बहुत बुरा है __dirname अभी भी script.js के भीतर उपलब्ध नहीं है
केविन व्हीलर

upvoted! मुझे 15 मिनट बचाया क्योंकि मैं सोच रहा था कि wtf हो रहा है
PirateApp

96

मौजूदा उत्तरों के आधार पर, आप इसे अपने REPL में परिभाषित कर सकते हैं:

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

या:

__dirname = path.resolve();

यदि कोई pathसेगमेंट पास नहीं हुआ है, path.resolve()तो वर्तमान वर्किंग डाइरेक्टरी के निरपेक्ष पथ को लौटा देगा।


या @ जोर्तेप के विकल्प:

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

यदि आप उपयोग neshकरते हैं तो आप इसे अपनी लोड स्क्रिप्ट के भाग के रूप में परिभाषित कर सकते हैं; यह निफ्टी
jcollum

1
या __dirname = process.cwd()या __dirname=fs.realpathSync('.')या__dirname = process.env.PWD
Jthorpe

1
path.dirnameलगता है कि अब नए प्रमुख संस्करण में गैर-स्ट्रिंग मानों को स्वीकार नहीं किया जाएगा 6.0.0, इसलिए इस उत्तर में पहला सुझाव काम नहीं करेगा।
trysis

30

ईएस 6 उपयोग में:

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

नोड के साथ कॉल करने पर भी उपलब्ध है --experimental-modules


आपको REPL में कोर मॉड्यूल आयात करने की आवश्यकता नहीं है; यह उन्हें आपके लिए मक्खी पर लाद देगा।
c24w

यह वर्तमान कार्यशील निर्देशिका देता है, वर्तमान .jsफ़ाइल की निर्देशिका नहीं ।
डिबारियो

@Dirbaio, जब आप REPL में हों तो वर्तमान .jsफ़ाइल क्या होगी ?
c24w

@ c24w ने अभी जाँच की, यह CWD
Dirbaio

@Dirbaio मुझे लगता है कि मेरी बात थी। जब आप REPL में प्रवेश करते हैं, तो कोई JS फाइल नहीं होती है। __dirnameCWD नहीं तो आप क्या बनना चाहेंगे ?
c24w

8

जैसा कि @qiao ने कहा, आप __dirnameनोड उत्तर में उपयोग नहीं कर सकते । हालाँकि, यदि आपको कंसोल में इस मान की आवश्यकता है, तो आप उपयोग कर सकते हैं path.resolve()या path.dirname()। हालांकि, path.dirname()बस आपको एक "दे देंगे।" तो, शायद यह उपयोगी नहीं है। के लिए सुनिश्चित करें require('path')


3

लगता है कि आप भी ऐसा कर सकते हैं:

__dirname=fs.realpathSync('.');

बेशक, मत भूलना fs=require('fs')

(यह वास्तव में नोड लिपियों में वैश्विक नहीं है, इसका सिर्फ मॉड्यूल स्तर पर परिभाषित किया गया है)


आपको REPL में कोर मॉड्यूल की आवश्यकता नहीं है; यह उन्हें आपके लिए मक्खी पर लाद देगा।
c24w

3

मैं भी अपने रास्ते से जुड़ने की कोशिश कर रहा था path.join(__dirname, 'access.log')लेकिन यह उसी त्रुटि को फेंक रहा था।

यहाँ बताया गया है कि मैंने इसे कैसे तय किया:

मैंने पहले पथ पैकेज को आयात किया और नामांकित चर घोषित किया __dirname, फिर resolve पथ विधि को बुलाया ।

कॉमन जेजेएस में

var path = require("path");

var __dirname = path.resolve();

ES6 + में

import path  from 'path';

const __dirname = path.resolve();

हैप्पी कोडिंग .......


2

मैं बैच फ़ाइल से सिस्टम उपयोगकर्ता और जैसे सभी चर की तरह एक स्क्रिप्ट चला रहा था 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();

यदि आप इसे REPL के माध्यम से नहीं चला रहे हैं, तो आप उपयोग कर सकते हैं __dirnameऔर __filename
c24w

यह एकमात्र उत्तर है जो कम से कम सही समाधान प्रदान करने की कोशिश करता है।
टॉम ज़ातो -

@ c24w मैंने __dirname, __filename और बाकी सब कुछ आज़माया। मेरे मामले में कोई मानक समाधान काम नहीं किया। यहाँ मेरी परियोजना है जो कार्य अनुसूचक से सिस्टम के रूप में एक प्रक्रिया चलाता है यदि आप github.com/DVLP/Unscheduler से ऊब चुके हैं। कोई भी मानक समाधान जो अन्यथा काम करता है, स्पष्ट रूप से ऊपर मेरी हैक से बेहतर है :)
पावेल

1

हालांकि इसका इस समस्या का हल नहीं है, मैं इसे जोड़ना चाहूंगा क्योंकि यह दूसरों की मदद कर सकता है।

Dirname से पहले आपके पास दो अंडरस्कोर होना चाहिए , एक अंडरस्कोर__dirname नहीं ( नहीं _dirname)।

नोडजेएस डॉक्स


__dirname (दो अंडरस्कोर के साथ) REPL में काम नहीं करता है
हारून जे स्पेटनर

1

आप मिल गया तो node __dirname not definedसाथ node --experimental-modules, आप कर सकते हैं:

const __dirname = path.dirname(import.meta.url)
                      .replace(/^file:\/\/\//, '') // can be usefull

Othe उदाहरण के लिए, केवल वर्तमान / pwd निर्देशिका के साथ काम करें अन्य निर्देशिका नहीं।


1

यदि आप Node.js मॉड्यूल का उपयोग कर रहे हैं , __dirnameऔर __filenameमौजूद नहीं है।

से Node.js प्रलेखन :

कोई आवश्यकता नहीं है, निर्यात, मॉड्यूल ।exports, __filename, __dirname

ये कॉमनजेएस चर ईएस मॉड्यूल में उपलब्ध नहीं हैं।

requireईएस मॉड्यूल का उपयोग करके आयात किया जा सकता है module.createRequire()

के समकक्ष __filenameऔर __dirnameप्रत्येक फ़ाइल के माध्यम से बनाया जा सकता है import.meta.url:

import { fileURLToPath } from 'url';
import { dirname } from 'path';

const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);

https://nodejs.org/api/esm.html#esm_no_require_exports_module_exports_filename_dirname


0

कभी-कभी हम .js एक्सटेंशन के साथ एक फ़ाइल बनाते हैं और consol.log (_dirname) जोड़ते हैं; लेकिन हम त्रुटियों का सामना करते हैं, हम जल्दी में हैं, इसलिए हम "dirname" से पहले एक और अंडरस्कोर जोड़ना भूल जाते हैं, इसलिए हम संदर्भ त्रुटि का सामना करते हैं। सही सिंटैक्स consol.log (__ dirname) है;

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.