নোড __নির্দিষ্ট সংজ্ঞায়িত করা হয়নি


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
এছাড়াও আপনি প্রয়োজনীয় জেএস মডিউলগুলির মধ্যে কিছু গ্লোবাল ভেরিয়েবল ব্যবহার করতে পারবেন না। আপনি সার্ভারে পাশ RequireJS ব্যবহার করেন, তাহলে দেখতে stackoverflow.com/questions/9027429/... ।
— চোখ

1
হ্যাঁ, এটি উত্তর আইতে সত্যিই যুক্ত করা উচিত, কারণ এটিই আমাকে পেয়েছিল।
— টোমা জ্যাটো - মনোকা

3
আরএপিএল এর লোড স্ক্রিপ্ট এ যোগ না করা অসুবিধাজনক। এটি কোনও কারণেই হবে না বলে আমি ভাবতে পারি না ...
— jcollum

REPL ব্যবহার করার সময় আমি একটি স্ক্রিপ্ট ফাইল লোড করেছি .load script.js। এটি খুব খারাপ __নির্দেশটি এখনও স্ক্রিপ্ট.জেএস এর মধ্যে থেকে পাওয়া যায় না
— কেভিন হুইলার


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, সুতরাং এই উত্তরের প্রথম পরামর্শটি কার্যকর হবে না।
— ট্রিপসিস

30

ES6- এ ব্যবহার করুন:

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

নোডের সাথে কল করার সময় এটি উপলব্ধ --experimental-modules


আপনাকে আরইপিএলে মূল মডিউলগুলি আমদানি করতে হবে না; এটি আপনার জন্য ফ্লাইতে এগুলি লোড করবে।
— c24w

এটি বর্তমান কাজের ডিরেক্টরি দেয়, বর্তমান .jsফাইলের ডিরেক্টরি নয় ।
— দিরবাইও

@ দিরবাইও, আপনি আরপিএলে থাকাকালীন বর্তমান .jsফাইলটি কী হবে ?
— সি 24 ডাব্লু

@ c24w সবেমাত্র যাচাই করা হয়েছে, মনে হচ্ছে
— সিডাব্লুডি

@ দিরভাইও আমি মনে করি এটি আমার বক্তব্য ছিল। আপনি যখন REPL প্রবেশ করেন তখন কোনও বর্তমান জেএস ফাইল নেই। আপনি কী হতে চান __dirname, সিডাব্লুডি না হলে?
— c24w

8

যেমন @ কিয়াও বলেছেন, আপনি __dirnameনোড repl এ ব্যবহার করতে পারবেন না । তবে কনসোলে আপনার যদি এই মানটির প্রয়োজন হয় তবে আপনি ব্যবহার করতে পারেন path.resolve()বা করতে পারেন path.dirname()। যদিও, path.dirname()আপনাকে কেবল একটি "দেবে"। সুতরাং, সম্ভবত যে সহায়ক না। নিশ্চিত হন require('path')।


3

দেখে মনে হচ্ছে আপনি এটি করতে পারেন:

__dirname=fs.realpathSync('.');

অবশ্যই, ভুলবেন না fs=require('fs')

(এটি নোড স্ক্রিপ্টগুলিতে আসলেই বৈশ্বিক নয়, এটি কেবলমাত্র মডিউল স্তরে সংজ্ঞায়িত হয়েছে)


আরপিএলে আপনার মূল মডিউলগুলির প্রয়োজন হবে না; এটি আপনার জন্য ফ্লাইতে এগুলি লোড করবে।
— সি 24 ডাব্লু

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()এবং অন্যান্য সব পদ্ধতি আমাকে সি পাথ দিতে হবে: প্রকৃত পথের পরিবর্তে \ উইন্ডোজ \ 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 বিরক্ত হলে টাস্ক শিডিয়ুলার থেকে SYSTEM হিসাবে একটি প্রক্রিয়া চালায়। যে কোনও মানক সমাধান যা অন্যথায় কাজ করে তা উপরের আমার হ্যাকের চেয়ে স্পষ্টতই ভাল :)
— পাভেল

1

যদিও এটি এই সমস্যার সমাধান নয় তবে আমি এটি যুক্ত করতে চাই কারণ এটি অন্যকে সহায়তা করতে পারে।

নামকরণের আগে আপনার দুটি আন্ডারস্কোর থাকতে হবে, একটি আন্ডারস্কোর__dirname নয় ( নয় _dirname)।

নোডজেএস ডক্স


__ ডিরেক্টরি (দুটি আন্ডারস্কোর সহ) নামটি আরপিএলে কাজ করে না
— অ্যারন জে স্পটনার

1

যদি আপনার সাথে node __dirname not definedহয় তবে node --experimental-modulesআপনি এটি করতে পারেন:

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

কারণ অন্য উদাহরণস্বরূপ, কেবল বর্তমান / পিডাব্লুডি ডিরেক্টরি দিয়ে কাজ করুন অন্য ডিরেক্টরি নয়।


1

আপনি ব্যবহার করে থাকেন Node.js মডিউল , __dirnameএবং __filenameকোন অস্তিত্ব নেই।

থেকে Node.js ডকুমেন্টেশন :

কোনও প্রয়োজন নেই, রফতানি, মডিউল.এক্সপোর্টস, __ ফাইলনাম, __ ডিরেক্টরি

এই সাধারণ জেএস ভেরিয়েবলগুলি ইএস মডিউলগুলিতে উপলভ্য নয়।

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 এক্সটেনশন দিয়ে একটি ফাইল তৈরি করি এবং কনসোল.লগ (_ডিরনাম) যুক্ত করি; তবে আমরা ত্রুটিগুলির মুখোমুখি হয়েছি, আমরা তাড়াহুড়ো করে রয়েছি, তাই আমরা "ডাইরনাম" এর আগে আরও একটি আন্ডারস্কোর যুক্ত করতে ভুলে গেছি যাতে আমরা রেফারেন্স ত্রুটির মুখোমুখি হই .c

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.