Node.js Readline Module

Node.js

রিডলাইন মডিউলের ভূমিকা

রিডলাইন মডিউল হল একটি মূল Node.js মডিউল যা একটি পঠনযোগ্য স্ট্রীম (যেমন process.stdin) থেকে একবারে একটি লাইন থেকে ডেটা পড়ার জন্য একটি ইন্টারফেস প্রদান করে।

এটি বিশেষভাবে দরকারী:

ইন্টারেক্টিভ কমান্ড লাইন অ্যাপ্লিকেশন

ব্যবহারকারীদের সাথে ইন্টারঅ্যাক্ট করে এমন CLI অ্যাপ্লিকেশন তৈরি করা

স্ট্রাকচার গাইড

সেটআপ গাইড এবং সেটআপ টুল

কমান্ড লাইন গেম

টেক্সট-ভিত্তিক গেম এবং অ্যাপ

সাধারণ ব্যবহারের ক্ষেত্রে

মূল বৈশিষ্ট্য

💡দ্রষ্টব্য:

রিডলাইন মডিউলটি Node.js-এ অন্তর্নির্মিত, তাই কোনও অতিরিক্ত ইনস্টলেশনের প্রয়োজন নেই।

কমান্ড লাইনের মাধ্যমে ব্যবহারকারীদের সাথে যোগাযোগ করতে বা লাইন-ভিত্তিক উপায়ে পাঠ্য ইনপুট প্রক্রিয়া করার প্রয়োজন এমন যেকোনো অ্যাপ্লিকেশনের জন্য এটি আদর্শ।

রিডলাইন দিয়ে শুরু করা

রিডলাইন মডিউল ব্যবহার করে একটি সাধারণ ইন্টারেক্টিভ কমান্ড-লাইন অ্যাপ্লিকেশন তৈরি করার একটি দ্রুত উদাহরণ এখানে:

মৌলিক ইন্টারেক্টিভ প্রম্পট

const readline = require('readline'); // ইনপুট/আউটপুটের জন্য একটি ইন্টারফেস তৈরি করুন const rl = readline.createInterface({ ইনপুট: process.stdin, আউটপুট: process.stdout }); // একটি প্রশ্ন জিজ্ঞাসা করুন এবং প্রতিক্রিয়া পরিচালনা করুন rl.question('আপনার নাম কি?', (নাম) => { console.log(`হ্যালো, ${name}!`); // প্রশ্ন জিজ্ঞাসা করা চালিয়ে যান rl.question('আপনার বয়স কত?', (বয়স) => { console.log(`5 বছরের মধ্যে, আপনি ${parseInt(বয়স) + 5} বছর বয়সী হবেন।`); // হয়ে গেলে ইন্টারফেস বন্ধ করুন rl.close(); }); }); // অ্যাপ্লিকেশন প্রস্থান হ্যান্ডেল rl.on('close', () => { console.log('বিদায়!'); process.exit(0); });

আমদানি এবং সেটআপ

আপনার মডিউল সেটআপ এবং প্রয়োজনীয়তার উপর নির্ভর করে রিডলাইন মডিউলটি বিভিন্ন উপায়ে আমদানি করা যেতে পারে:

CommonJS (Node.js ডিফল্ট)

// মৌলিক প্রয়োজন const readline = require('readline'); // destructuring ব্যবহার করে নির্দিষ্ট পদ্ধতি আমদানি করুন const { createInterface } = require('readline'); // ডিফল্ট সেটিংস সহ ইন্টারফেস তৈরি করুন const rl = createInterface({ ইনপুট: process.stdin, আউটপুট: process.stdout });

ES মডিউল (Node.js 12+)

// ডিফল্ট আমদানি ব্যবহার করে 'রিডলাইন' থেকে রিডলাইন আমদানি করুন; // নামযুক্ত আমদানি ব্যবহার করে 'রিডলাইন' থেকে { createInterface } আমদানি করুন; // গতিশীল আমদানি (Node.js 14+) const { createInterface } = await import('readline'); // ইন্টারফেস তৈরি করুন const rl = createInterface({ ইনপুট: process.stdin, আউটপুট: process.stdout });

🔧সর্বোত্তম অনুশীলন:

rl.close() ব্যবহার করে সর্বদা রিডলাইন ইন্টারফেসটি বন্ধ করুন, যখন আপনি এটি সম্পন্ন করেন, যা সিস্টেম সংস্থানগুলিকে খালি করতে সহায়তা করে এবং আপনার প্রোগ্রামটিকে পরিষ্কারভাবে প্রস্থান করার অনুমতি দেয়।

একটি রিডলাইন ইন্টারফেস তৈরি করা হচ্ছে

CreateInterface পদ্ধতিটি একটি রিডলাইন ইন্টারফেস তৈরি করার প্রধান উপায়। এটি বেশ কয়েকটি কনফিগারেশন বৈশিষ্ট্য সহ একটি বিকল্প অবজেক্ট নেয়:

মৌলিক ইন্টারফেস তৈরি

const readline = require('readline'); // একটি বেস ইন্টারফেস তৈরি করুন const rl = readline.createInterface({ ইনপুট: process.stdin, // শোনার জন্য পঠনযোগ্য স্ট্রিম আউটপুট: process.stdout, // লিখতে যোগ্য স্ট্রীম প্রম্পট: '>', // ব্যবহার করার জন্য প্রম্পট স্ট্রিং (ডিফল্ট: '>') });

সাধারণ বিকল্প:

উন্নত ইন্টারফেসের উদাহরণ

const readline = require('readline'); const fs = প্রয়োজন('fs'); // উন্নত বিকল্পগুলির সাথে একটি ইন্টারফেস তৈরি করুন const rl = readline.createInterface({ ইনপুট: fs.createReadStream('input.txt'), // ফাইল থেকে পড়ুন আউটপুট: process.stdout, // কনসোলে লিখুন টার্মিনাল: মিথ্যা, // ইনপুট একটি টার্মিনাল নয় ইতিহাসের আকার: 100, // বড় ইতিহাস removeHistoryDuplicates: true, // ডুপ্লিকেট কমান্ড সঞ্চয় করবেন না প্রম্পট: 'CLI>', // কাস্টম প্রম্পট crlfDelay: Infinity, // সমস্ত CR/LF-কে একক লাইন বিরতি হিসাবে বিবেচনা করুন escapeCodeTimeout: 200 // দ্রুত এস্কেপ কোড সনাক্তকরণ }); // ফাইল থেকে প্রতিটি লাইন পরিচালনা করুন rl.on('লাইন', (লাইন) => { console.log(`প্রসেসিং: ${line}`); }); // ফাইলের শেষ হ্যান্ডেল করুন rl.on('close', () => { console.log('সমাপ্ত প্রক্রিয়াকরণ ফাইল'); });

📝দ্রষ্টব্য:

ফাইল প্রক্রিয়াকরণের জন্য ইন্টারফেস তৈরি করার সময়, TTY-নির্দিষ্ট বৈশিষ্ট্যগুলি নিষ্ক্রিয় করতে এবং কর্মক্ষমতা উন্নত করতে টার্মিনাল: মিথ্যা সেট করুন।

বেসিক রিডলাইন পদ্ধতি

রিডলাইন মডিউল ব্যবহারকারীর সাথে যোগাযোগ করার জন্য বিভিন্ন পদ্ধতি প্রদান করে। এখানে কিছু প্রায়শই ব্যবহৃত পদ্ধতি রয়েছে:

1. rl.question(query, callback)

ব্যবহারকারীর কাছে একটি প্রশ্ন প্রদর্শন করে এবং ব্যবহারকারীর প্রতিক্রিয়া সহ একটি কলব্যাক কল করে। এটি সাধারণ ব্যবহারকারীর মিথস্ক্রিয়াগুলির জন্য সর্বাধিক ব্যবহৃত পদ্ধতিগুলির মধ্যে একটি।

একটি মৌলিক উদাহরণ

const readline = require('readline');
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

rl.question('What is your name? ', (name) => {
  console.log(`Hello, ${name}!`);
  rl.close();
});

নেস্টেড প্রশ্নের উদাহরণ

function askQuestion(query) {
  return new Promise(resolve => {
    rl.question(query, resolve);
  });
}

async function userSurvey() {
  try {
    const name = await askQuestion('What is your name? ');
    const age = await askQuestion('How old are you? ');
    const email = await askQuestion('What is your email? ');

    console.log('\n=== User Information ===');
    console.log(`Name: ${name}`);
    console.log(`Age: ${age}`);
    console.log(`Email: ${email}`);

  } catch (error) {
    console.error('An error occurred:', error);
  } finally {
    rl.close();
  }
}

userSurvey();

rl.question() :

2. rl.prompt([preserveCursor])

আউটপুটে বর্তমান প্রম্পট লেখে এবং ব্যবহারকারীর ইনপুটের জন্য অপেক্ষা করে। ঐচ্ছিক preserveCursor প্যারামিটার (বুলিয়ান) নির্ধারণ করে যে কার্সারের অবস্থান সংরক্ষণ করা উচিত কিনা।

একটি মৌলিক প্রম্পটের উদাহরণ

const readline = require('readline'); const rl = readline.createInterface({ ইনপুট: process.stdin, আউটপুট: process.stdout, প্রম্পট: 'CLI>' }); // প্রাথমিক প্রম্পট প্রদর্শন করুন rl.prompt(); // ইনপুট প্রতিটি লাইন হ্যান্ডেল rl.on('লাইন', (লাইন) => { const ইনপুট = line.trim(); সুইচ (ইনপুট) { কেস 'হ্যালো': console.log('হ্যালো সেখানে!'); বিরতি কেস 'সময়': console.log(`বর্তমান সময়: ${new Date().toLocaleTimeString()}`); বিরতি কেস 'প্রস্থান': rl.close(); প্রত্যাবর্তন ডিফল্ট: console.log(`আপনি প্রবেশ করেছেন: ${input}`); } // আবার প্রম্পট প্রদর্শন করুন rl.prompt(); }); // অ্যাপ্লিকেশন প্রস্থান হ্যান্ডেল rl.on('close', () => { console.log('বিদায়!'); process.exit(0); });

প্রম্পট ব্যবহার করার জন্য টিপস:

3. rl.write(data[, key])

আউটপুট স্ট্রীমে ডেটা লেখে। ঐচ্ছিক কী প্যারামিটারটি কীস্ট্রোক অনুকরণ করতে ব্যবহার করা যেতে পারে।

উদাহরণ লেখ

const readline = require('readline'); const rl = readline.createInterface({ ইনপুট: process.stdin, আউটপুট: process.stdout }); // একটি স্বাগত বার্তা প্রদর্শন করুন rl.write('CLI অ্যাপ্লিকেশনে স্বাগতম!\n'); rl.write('='.repeat(30) + '\n\n'); // একটি ডিফল্ট মান প্রিলোড করুন rl.question('আপনার ব্যবহারকারীর নাম লিখুন:', (ব্যবহারকারীর নাম) => { console.log(`হ্যালো, ${username}!`); // একটি ডিফল্ট মান টাইপ করা অনুকরণ করুন rl.write('default@example.com'); // লাইনের শুরুতে কার্সার সরান rl.write(null, { ctrl: true, name: 'a' }); rl.question('আপনার ইমেল লিখুন:', (ইমেল) => { console.log(`আপনার ইমেল হল: ${email}`); rl.close(); }); });

rl.write() :

4. rl.close()

রিডলাইন ইন্টারফেস বন্ধ করে এবং ইনপুট এবং আউটপুট স্ট্রীমের নিয়ন্ত্রণ প্রকাশ করে। সিস্টেম রিসোর্স মুক্ত করা এবং আপনার প্রোগ্রামকে পরিষ্কারভাবে প্রস্থান করার অনুমতি দেওয়ার জন্য এটি গুরুত্বপূর্ণ।

একটি নিখুঁত পরিষ্কার আপ উদাহরণ

const readline = require('readline'); const rl = readline.createInterface({ ইনপুট: process.stdin, আউটপুট: process.stdout }); // অ্যাপ্লিকেশন প্রস্থান হ্যান্ডেল ফাংশন exitApp() { console.log('\nসম্পদ পরিষ্কার করা...'); // যেকোন প্রয়োজনীয় পরিষ্কার-পরিচ্ছন্নতা সম্পাদন করুন // (যেমন, ডাটাবেস সংযোগ বন্ধ করা, রেকর্ড লেখা ইত্যাদি) // রিডলাইন ইন্টারফেস বন্ধ করুন rl.close(); } // Ctrl+C হ্যান্ডেল করুন rl.on('SIGINT', () => { console.log('\nSIGINT প্রাপ্ত হয়েছে। প্রস্থান হচ্ছে...'); exitApp(); }); // স্বাভাবিক আউটপুট পরিচালনা করুন rl.on('close', () => { console.log('বিদায়!'); process.exit(0); }); // অ্যাপ্লিকেশন শুরু করুন console.log('অ্যাপ্লিকেশন শুরু হয়েছে। প্রস্থান করতে Ctrl+C টিপুন।'); rl.prompt();

5. rl.pause() এবং rl.resume()

এই পদ্ধতিগুলি আপনাকে অস্থায়ীভাবে ইনপুট স্ট্রীমকে বিরতি এবং পুনরায় শুরু করার অনুমতি দেয়, যা ব্যবহারকারীর ইনপুট প্রবাহ নিয়ন্ত্রণের জন্য দরকারী।

পজ/চালিয়ে যান উদাহরণ

const readline = require('readline');
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

let isPaused = false;

console.log('Type "pause" to pause input, "resume" to continue, or "exit" to quit');

rl.on('line', (input) => {
  const command = input.trim().toLowerCase();

  switch (command) {
    case 'pause':
      if (!isPaused) {
        console.log('Input paused. Type "resume" to continue...');
        rl.pause();
        isPaused = true;
      }
      break;

    case 'resume':
      if (isPaused) {
        console.log('Resuming input...');
        rl.resume();
        rl.prompt();
        isPaused = false;
      }
      break;

    case 'exit':
      console.log('Goodbye!');
      rl.close();
      return;

    default:
      if (!isPaused) {
        console.log(`You entered: ${input}`);
        rl.prompt();
      }
  }
});

rl.prompt();

কখন পজ/রিজুমে ব্যবহার করবেন:

পদ্ধতির সারাংশ

পদ্ধতি ব্যাখ্যা
rl.question(query, callback) ক্যোয়ারী প্রদর্শন করে এবং ব্যবহারকারীর ইনপুটের জন্য অপেক্ষা করে, তারপর ব্যবহারকারীর প্রতিক্রিয়া সহ কলব্যাক কল করে
rl.prompt([preserveCursor]) ব্যবহারকারীর ইনপুটের জন্য একটি কাঠামোগত প্রম্পট প্রদর্শন করে
rl.write(data[, key]) আউটপুট স্ট্রীমে ডেটা লেখে, কী-প্রেস ইভেন্টগুলিও অনুকরণ করতে পারে
rl.close() রিডলাইন ইন্টারফেস বন্ধ করে এবং ইনপুট এবং আউটপুট স্ট্রীমের নিয়ন্ত্রণ প্রকাশ করে
rl.pause() readline ইনপুট স্ট্রীম বিরতি দেয়
rl.resume() রিডলাইন ইনপুট স্ট্রীম পুনরায় শুরু করে

রিডলাইনের সাথে প্রতিশ্রুতি ব্যবহার করা

রিডলাইন মডিউলের কলব্যাক-ভিত্তিক API আরও আধুনিক, অ্যাসিঙ্ক/ওয়েট ফ্রেন্ডলি কোডের প্রতিশ্রুতিতে কাস্ট করা যেতে পারে:

const readline = require('readline'); // ইন্টারফেস তৈরি করুন const rl = readline.createInterface({ ইনপুট: process.stdin, আউটপুট: process.stdout }); // প্রতিশ্রুতি-ভিত্তিক ক্যোয়ারী ফাংশন ফাংশন askQuestion(কোয়েরি) { নতুন প্রতিশ্রুতি ফেরত (সমাধান => { rl.question(কোয়েরি, সমাধান); }); } // রিডলাইনের সাথে async/await ব্যবহার করা অ্যাসিঙ্ক ফাংশন প্রধান() { চেষ্টা করুন { const name = await askQuestion('আপনার নাম কি?'); console.log(`হ্যালো, ${name}!`); const age = await askQuestion('আপনার বয়স কত?'); console.log(`5 বছরের মধ্যে, আপনি ${parseInt(বয়স) + 5} বছর বয়সী হবেন।`); const location = await askQuestion('আপনি কোথায় থাকেন?'); console.log(`${location} একটি দুর্দান্ত জায়গা!`); console.log('আপনার উত্তরের জন্য ধন্যবাদ!'); } ধরা (ত্রুটি) { console.error('Error:', error); } অবশেষে { rl.close(); } } // প্রধান ফাংশন চালান প্রধান();

একটি ইন্টারেক্টিভ CLI মেনু তৈরি করা হচ্ছে

কমান্ড-লাইন অ্যাপ্লিকেশনগুলির জন্য ইন্টারেক্টিভ মেনু তৈরি করতে Readline মডিউল ব্যবহার করা যেতে পারে:

const readline = require('readline'); // ইন্টারফেস তৈরি করুন const rl = readline.createInterface({ ইনপুট: process.stdin, আউটপুট: process.stdout }); // মেনু বিকল্প const মেনু = { 1: 'বর্তমান সময় দেখান', 2: 'সিস্টেম তথ্য দেখান', 3: 'মেমরি ব্যবহার দেখান', 4: 'প্রস্থান করুন' }; // ফাংশন যা মেনু প্রদর্শন করে ফাংশন প্রদর্শন মেনু() { console.log('\n===== প্রধান মেনু ====='); এর জন্য (const [কী, মান] of Object.entries(মেনু)) { console.log(`${key}: ${value}`); } console.log('====================\n'); } // ফাংশন যা মেনু নির্বাচন পরিচালনা করে অ্যাসিঙ্ক ফাংশন হ্যান্ডেল মেনু() { চলুন = সত্য; যখন (চলমান) { ডিসপ্লেমেনু(); const উত্তর = await askQuestion('একটি বিকল্প নির্বাচন করুন:'); সুইচ (উত্তর) { কেস '1': console.log(`বর্তমান সময়: ${new Date().toLocaleTimeString()}`); বিরতি কেস '2': console.log('সিস্টেম তথ্য:'); console.log(`প্ল্যাটফর্ম: ${process.platform}`); console.log(`Node.js সংস্করণ: ${process.version}`); console.log(`প্রসেস আইডি: ${process.pid}`); বিরতি কেস '3': const memory = process.memoryUsage(); console.log('মেমরি ব্যবহার:'); এর জন্য (const [কী, মান] অবজেক্ট. এন্ট্রি(মেমরি)) { console.log(`${key}: ${Math.round(value / 1024 / 1024 * 100) / 100} MB`); } বিরতি কেস '4': console.log('প্রোগ্রাম থেকে বের হচ্ছে। বিদায়!'); চলমান = মিথ্যা; বিরতি ডিফল্ট: console.log('অবৈধ বিকল্প। অনুগ্রহ করে আবার চেষ্টা করুন।'); } যদি (চলমান) { await askQuestion('\nচালিয়ে যেতে এন্টার টিপুন...'); console.clear(); // ভাল ইউএক্সের জন্য কনসোলটি সাফ করুন } } } // প্রতিশ্রুতি-ভিত্তিক ক্যোয়ারী ফাংশন ফাংশন askQuestion(কোয়েরি) { নতুন প্রতিশ্রুতি ফেরত (সমাধান => { rl.question(কোয়েরি, সমাধান); }); } // ইন্টারেক্টিভ মেনু শুরু করুন হ্যান্ডেল মেনু() অবশেষে(() => { rl.close(); });

লাইন দ্বারা একটি ফাইল লাইন পড়া

ইন্টারেক্টিভ ইনপুট ছাড়াও, রিডলাইন মডিউল লাইন দ্বারা ফাইলগুলিও পড়তে পারে, যা বড় টেক্সট ফাইলগুলির দক্ষ প্রক্রিয়াকরণের জন্য দরকারী:

const fs = প্রয়োজন('fs'); const readline = require('readline'); // ফাইলের জন্য একটি পঠনযোগ্য স্ট্রিম তৈরি করুন const fileStream = fs.createReadStream('example.txt'); // রিডলাইন ইন্টারফেস তৈরি করুন const rl = readline.createInterface({ ইনপুট: ফাইলস্ট্রিম, crlfDelay: Infinity // CR LF-এর সমস্ত ঘটনাকে একক লাইন বিরতি হিসাবে স্বীকৃতি দিন }); // লাইন নম্বরের জন্য কাউন্টার চলুন লাইন নম্বর = 0; // লাইন দ্বারা ফাইল লাইন প্রক্রিয়া rl.on('লাইন', (লাইন) => { লাইন নম্বর ++; console.log(`লাইন ${lineNumber}: ${line}`); }); // ফাইলের শেষ হ্যান্ডেল করুন rl.on('close', () => { console.log(`${lineNumber} লাইন দিয়ে ফাইল পড়া শেষ।`); });

💾দ্রষ্টব্য:

এই পদ্ধতিটি বড় ফাইলগুলির জন্য মেমরি-দক্ষ কারণ এটি পুরো ফাইলটিকে মেমরিতে লোড করার পরিবর্তে একবারে একটি লাইন প্রক্রিয়া করে।

টেপের শেষ

ট্যাব শেষ কমান্ড এবং ফাইল পাথ পরামর্শ প্রদান করে ব্যবহারকারীর অভিজ্ঞতা উন্নত করে। রিডলাইন মডিউল আপনাকে কাস্টম উপসংহার যুক্তি প্রয়োগ করতে দেয়:

কিভাবে ট্যাব সিদ্ধান্ত কাজ করে:

const readline = require('readline'); const fs = প্রয়োজন('fs'); const path = require('path'); // স্বয়ংক্রিয় সমাপ্তির জন্য উপলব্ধ কমান্ড const commands = ['সহায়তা', 'প্রস্থান', 'তালিকা', 'ক্লিয়ার', 'তথ্য', 'সংস্করণ', 'ইতিহাস']; // একটি সম্পূর্ণ ফাংশন সহ একটি রিডলাইন ইন্টারফেস তৈরি করুন const rl = readline.createInterface({ ইনপুট: process.stdin, আউটপুট: process.stdout, প্রম্পট: 'myapp>', সম্পূর্ণকারী: ফাংশন(লাইন) { // কমান্ডের শেষ যদি (!line.includes('')) { const hits = commands.filter(c => c.startsWith(line)); // কোনো মিল না থাকলে সব ফলাফল প্রদর্শন করুন [hits.length? হিট: কমান্ড, লাইন]; } // ফাইল পাথ ফলাফল ("তালিকা" এর মত কমান্ডের জন্য) যদি (line.startsWith('list')) { const dir = line.split('')[1] || '।'; চেষ্টা করুন { let completions = fs.readdirSync(dir); // ডিরেক্টরির পরে স্ল্যাশ যোগ করুন completions = completions.map(ফাইল => { const fullPath = path.join(dir, file); ফিরুন fs.statSync(fullPath).isDirectory()? ফাইল + '/' : ফাইল; }); const hits = completions.filter(c => c.startsWith(line.split('')[1] ||'')); [hits.length? হিট: সমাপ্তি, লাইন. স্প্লিট('')[1] || '']; } ধরা (ত্রুটি) { প্রত্যাবর্তন [[], লাইন]; } } প্রত্যাবর্তন [[], লাইন]; } }); // প্রম্পট সেট করুন rl.prompt(); // কমান্ড পরিচালনা করুন rl.on('লাইন', (লাইন) => { লাইন = লাইন.ট্রিম(); সুইচ (সত্য) { কেস লাইন === 'হেল্প': console.log('উপলভ্য কমান্ড:'); commands.forEach(cmd => console.log(` ${cmd}`)); বিরতি কেস লাইন === 'প্রস্থান': console.log('বিদায়!'); rl.close(); প্রত্যাবর্তন case line.startsWith('list'): const dir = line.split('')[1] || '।'; চেষ্টা করুন { const ফাইল = fs.readdirSync(dir); console.log(${dir} এর বিষয়বস্তু:`); files.forEach(ফাইল => { const stats = fs.statSync(path.join(dir, file)); console.log(` ${file}${stats.isDirectory() ? '/' : ''}`); }); } ধরা (ত্রুটি) { console.error(`Error listing Directory: ${err.message}`); } বিরতি কেস লাইন === 'ক্লিয়ার': console.clear(); বিরতি কেস লাইন === 'তথ্য': console.log('Node.js CLI উদাহরণ'); console.log(`সংস্করণ: 1.0.0`); বিরতি কেস লাইন === 'সংস্করণ': console.log(`Node.js সংস্করণ: ${process.version}`); বিরতি কেস লাইন === 'ইতিহাস': // দ্রষ্টব্য: এটি ম্যানুয়ালি ইতিহাস সংরক্ষণ করা উচিত console.log('ইতিহাস বৈশিষ্ট্য সম্পূর্ণরূপে বাস্তবায়িত হয়নি।'); বিরতি কেস লাইন === '': // খালি লাইনের জন্য কিছুই করবেন না বিরতি ডিফল্ট: console.log(`অজানা কমান্ড: ${line}`); console.log('উপলব্ধ কমান্ডের জন্য "সহায়তা" টাইপ করুন'); } rl.prompt(); }).on('ক্লোজ', () => { console.log('CLI সমাপ্ত।'); process.exit(0); }); // Ctrl+C হ্যান্ডেল করুন rl.on('SIGINT', () => { rl.question('আপনি কি নিশ্চিত আপনি প্রস্থান করতে চান? (y/n)', (উত্তর) => { যদি (answer.toLowerCase() === 'y') { rl.close(); } অন্য { rl.prompt(); } }); });

মাল্টি-লাইন ইনপুট

রিডলাইন মডিউলটি মাল্টি-লাইন ইনপুট পরিচালনার জন্য দুর্দান্ত, এটি পাঠ্য সম্পাদক, কোড সম্পাদক বা ব্যবহারকারীদের কাছ থেকে একাধিক লাইন সংগ্রহ করার প্রয়োজন এমন যেকোনো অ্যাপ্লিকেশনের জন্য দুর্দান্ত করে তোলে। এটি কার্যকরভাবে কীভাবে করা যায় তা এখানে:

মাল্টি-লাইন ইনপুট টেকনিক:

const readline = require('readline'); // ইন্টারফেস তৈরি করুন const rl = readline.createInterface({ ইনপুট: process.stdin, আউটপুট: process.stdout, প্রম্পট: '>' }); console.log('আপনার মাল্টি-লাইন ইনপুট লিখুন। শেষ করতে একটি নতুন লাইনে ".end" টাইপ করুন:'); rl.prompt(); // লাইনগুলি সংরক্ষণ করুন const লাইন = []; // ইনপুট পরিচালনা করুন rl.on('লাইন', (লাইন) => { // শেষ কমান্ড চেক করুন যদি (line.trim() === '.end') { console.log('\nআপনার সম্পূর্ণ ইনপুট:'); console.log('-'.রিপিট(30)); console.log(lines.join('\n')); console.log('-'.রিপিট(30)); // ইনপুট প্রক্রিয়া করুন (উদাহরণ: শব্দ গণনা) const text = lines.join(''); const wordCount = text.split(/\s+/).ফিল্টার(বুলিয়ান).দৈর্ঘ্য; const charCount = text.length; console.log(`\nপরিসংখ্যান:`); console.log(`লাইনস: ${lines.length}`); console.log(`শব্দ: ${wordCount}`); console.log(`অক্ষর: ${charCount}`); rl.close(); প্রত্যাবর্তন } // সংগ্রহে লাইন যোগ করুন lines.push(লাইন); rl.prompt(); });

একটি সাধারণ REPL তৈরি করা

একটি রিড-ইভাল-প্রিন্ট লুপ (REPL) হল একটি ইন্টারেক্টিভ প্রোগ্রামিং পরিবেশ যা ব্যবহারকারীর ইনপুট পড়ে, এটিকে মূল্যায়ন করে এবং ফলাফল প্রিন্ট করে।

কাস্টম REPL তৈরি করার জন্য Readline মডিউলটি দুর্দান্ত। আপনার নিজের REPL তৈরি করার জন্য এখানে একটি বিশদ নির্দেশিকা রয়েছে:

একটি REPL এর প্রধান উপাদানগুলি হল:

const readline = require('readline'); const vm = প্রয়োজন('vm'); // ইন্টারফেস তৈরি করুন const rl = readline.createInterface({ ইনপুট: process.stdin, আউটপুট: process.stdout, প্রম্পট: 'js>' }); // কোড মূল্যায়ন করার জন্য একটি পরিবেশ তৈরি করুন const প্রসঙ্গ = vm.createContext({ কনসোল, সংখ্যা স্ট্রিং, অ্যারে, বস্তু // আপনি উপলব্ধ করতে চান অন্য কোনো বৈশ্বিক ভেরিয়েবল যোগ করুন // আপনি আপনার নিজস্ব ফাংশন যোগ করতে পারেন যোগ করুন: (a, b) => a + b, গুন করুন: (a, b) => a * b }); console.log('সাধারণ জাভাস্ক্রিপ্ট REPL (প্রস্থান করতে Ctrl+C টিপুন)'); console.log('জাভাস্ক্রিপ্ট কোড টাইপ করুন এবং মূল্যায়ন করতে এন্টার টিপুন'); // প্রম্পট প্রদর্শন করুন rl.prompt(); // মাল্টি-লাইন ইনপুট ট্র্যাক করুন let buffer = ''; // ইনপুট পরিচালনা করুন rl.on('লাইন', (লাইন) => { // আমাদের বাফারে লাইন যোগ করুন বাফার += লাইন; চেষ্টা করুন { // সূচক মূল্যায়ন করার চেষ্টা করুন const ফলাফল = vm.runInContext(বাফার, প্রসঙ্গ); // ফলাফল প্রদর্শন করুন console.log('\x1b[33m%s\x1b[0m', '=> ' + ফলাফল); // সফল মূল্যায়নের পর বাফার রিসেট করুন বাফার = ''; } ধরা (ত্রুটি) { // যদি এটি একটি সিনট্যাক্স ত্রুটি হয় এবং অসম্পূর্ণ ইনপুটের কারণে হতে পারে, // ইনপুট সংগ্রহ চালিয়ে যান যদি (SyntaxError && এর ত্রুটির উদাহরণ error.message.includes('ইনপুটের অপ্রত্যাশিত সমাপ্তি')) { // মাল্টি-লাইন মোডে চালিয়ে যান rl.setPrompt('...'); } অন্য { // এটি একটি বাস্তব ত্রুটি, এটি প্রদর্শন করুন এবং বাফার রিসেট করুন console.error('\x1b[31m%s\x1b[0m', 'Error: ' + error.message); বাফার = ''; rl.setPrompt('js>'); } } rl.prompt(); }); // Ctrl+C হ্যান্ডেল করুন rl.on('SIGINT', () => { যদি (buffer.length > 0) { // যদি একটি মুলতুবি এন্ট্রি থাকে, তাহলে তা সাফ করুন console.log('\nইনপুট সাফ'); বাফার = ''; rl.setPrompt('js>'); rl.prompt(); } অন্য { // অন্যথায় প্রস্থান করুন rl.question('\nআপনি কি নিশ্চিত যে আপনি প্রস্থান করতে চান? (y/n)', (উত্তর) => { যদি (answer.toLowerCase() === 'y') { console.log('বিদায়!'); rl.close(); } অন্য { rl.prompt(); } }); } }); rl.on('close', () => { console.log('REPL বন্ধ'); process.exit(0); });

সর্বোত্তম অনুশীলন

সর্বদা ইন্টারফেস বন্ধ করুন:আপনার কাজ শেষ হলে rl.close() এ কল করুন, যা সম্পদ পরিষ্কার করতে সাহায্য করে
ত্রুটিগুলি পরিচালনা করুন:সমস্ত রিডলাইন অপারেশনের জন্য ত্রুটি হ্যান্ডলিং প্রয়োগ করুন
প্রতিশ্রুতি ব্যবহার করুন:ক্লিন অ্যাসিঙ্ক কোডের প্রতিশ্রুতিতে কলব্যাক-ভিত্তিক পদ্ধতিগুলি রাখুন
UX বিবেচনা করুন:ব্যবহারকারীদের স্পষ্ট প্রম্পট এবং প্রতিক্রিয়া প্রদান করুন
ইভেন্ট হ্যান্ডলার ব্যবহার করুন:জটিল ইন্টারঅ্যাকশনের জন্য রিডলাইনের ইভেন্ট-ভিত্তিক প্রকৃতি ব্যবহার করুন
স্মৃতি ব্যবস্থাপনা:বড় ফাইলের সাথে সতর্ক থাকুন; লাইন দ্বারা লাইন তাদের প্রক্রিয়া
কীবোর্ড শর্টকাট যোগ করুন:সাধারণ কীবোর্ড শর্টকাটগুলির জন্য হ্যান্ডলার প্রয়োগ করুন (Ctrl+C, Ctrl+D)।

রিডলাইন এবং অন্যান্য ইনপুট পদ্ধতির তুলনা

পদ্ধতি সুবিধা অসুবিধা সেরা
Readline লাইন-বাই-লাইন প্রক্রিয়াকরণ, ইন্টারেক্টিভ ইনপুট, ইতিহাস, ফলাফল জটিল ইন্টারফেসের জন্য আরও কোড CLI, ইন্টারেক্টিভ প্রম্পট, REPLs
process.stdin নিম্ন-স্তরের নিয়ন্ত্রণ, কাঁচা তথ্য ব্যবহার করা কঠিন, ম্যানুয়াল বাফারিং বাইনারি ইনপুট, কাস্টম প্রোটোকল
Inquirer.js (3rd party) সমৃদ্ধ UI, একাধিক ইনপুট প্রকার, বৈধতা বাহ্যিক পক্ষপাত জটিল ফর্ম, জরিপ, কাঠামো গাইড
Commander.js (3rd party) কমান্ড সংজ্ঞা, বিকল্প পার্সিং কম ইন্টারেক্টিভ আর্গুমেন্ট সহ কমান্ড লাইন টুল

সারাংশ

Node.js Readline , .

এটি বিশেষভাবে দরকারী:

ইন্টারেক্টিভ কমান্ড প্রম্পট

CLI অ্যাপ্লিকেশন যা ব্যবহারকারীর ইনপুটের সাথে ইন্টারঅ্যাক্ট করে

ফাইল প্রসেসিং

লাইন দ্বারা ফাইল প্রক্রিয়াকরণ

কাস্টম REPL পরিবেশ

রিয়েল-টাইম কোড মূল্যায়নের জন্য পরিবেশ

পাঠ্য-ভিত্তিক ইন্টারফেস

টেক্সট-ভিত্তিক গেম এবং অ্যাপ

যদিও পৃষ্ঠে সহজ, প্রতিশ্রুতি, ইভেন্ট পরিচালনা এবং যথাযথ UX বিবেচনার সাথে রিডলাইনকে একত্রিত করা আপনাকে পরিশীলিত কমান্ড-লাইন অ্যাপ্লিকেশন তৈরি করতে দেয় যা একটি দুর্দান্ত ব্যবহারকারীর অভিজ্ঞতা প্রদান করে।

অনুশীলন করুন

রিডলাইন মডিউলে প্রশ্ন জিজ্ঞাসা করতে এবং ব্যবহারকারীর ইনপুটের জন্য অপেক্ষা করতে কোন পদ্ধতি ব্যবহার করা হয়?

rl.ask()
✗ ভুল! Node.js রিডলাইন মডিউলে "rl.ask()" একটি বৈধ পদ্ধতি নয়
rl.question()
✓ ঠিক আছে! "rl.question()" একটি বৈধ পদ্ধতি যা রিডলাইন মডিউলে একটি প্রশ্ন জিজ্ঞাসা করতে এবং ব্যবহারকারীর ইনপুটের জন্য অপেক্ষা করতে ব্যবহৃত হয়
rl.prompt()
✗ ভুল! "rl.prompt()" ব্যবহারকারীর ইনপুটের জন্য একটি প্রম্পট প্রদর্শন করে, কিন্তু একটি প্রশ্ন জিজ্ঞাসা করে না
rl.input()
✗ ভুল! Node.js Readline মডিউলে "rl.input()" একটি বৈধ পদ্ধতি নয়