Interface ma’lumotnomasi


ULASHISH

Interfeys obyekti

Interface klassi Node.js dagi readline modulining bir qismidir. U o‘qiladigan oqimdan (masalan, process.stdin kabi) ma’lumotlarni qatorma-qator o‘qish usulini taqdim etadi. U odatda buyruq qatori interfeyslarini (CLI) va interaktiv takliflarni yaratish uchun ishlatiladi.

Readline moduli import qilinmoqda

// Import the readline module
const readline = require('readline');

// Create an Interface instance
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});
O‘zingiz sinab ko‘ring »

Interfeys xususiyatlari

Xususiyat Tavsif
rl.line Hozirda qayta ishlanayotgan joriy kiritish qatori.
rl.cursor Joriy qatordagi kursor holati.
rl.input Foydalanilayotgan Readable stream.
rl.output Foydalanilayotgan Writable stream.
rl.terminal Oqimga TTY sifatida qarash va unga ANSI/VT100 qochish kodlari yozilishi kerakligini ko‘rsatadigan mantiqiy ko‘rsatkich.
rl.history Agar taqdim etilgan bo‘lsa, tarix buferi. Bu Promise-ga asoslangan APIdan foydalanganda mavjud emas.


Interfeys usullari

Metod Tavsif
rl.question(query, callback) Foydalanuvchiga query ko‘rsatadi va uning kiritilishini kutadi. Ular uni taqdim etgandan so‘ng, birinchi argument sifatida foydalanuvchi kiritishi bilan callback chaqiradi.
rl.close() Kirish va chiqish oqimlari ustidan nazoratdan voz kechib, Interfeys nusxasini yopadi.
rl.pause() O‘qishga kirish oqimini to‘xtatib, uni keyinroq davom ettirish imkonini beradi.
rl.resume() readline kiritish oqimini (stream) davom ettiradi.
rl.write(data[, key]) Chiqish oqimiga data yozadi. key argumenti ctrl yoki meta kabi maxsus belgilarga ega obyekt bo‘lishi mumkin.
rl.prompt([preserveCursor]) Foydalanuvchi kiritish uchun so‘rovni ko‘rsatadi. Agar preserveCursor true bo‘lsa, kursor o‘rni tiklanmaydi.
rl.getPrompt() Joriy taklif (prompt) stringini qaytaradi.
rl.setPrompt(prompt) rl.prompt() chaqirilganda ko‘rsatiladigan so‘rov stringini o‘rnatadi.

Interfeys hodisalari

Event Tavsif
'close' Interfeys namunasi yopilganda chiqariladi.
'line' Foydalanuvchi Enter tugmasini bosish orqali kiritish qatorini yuborganda chiqariladi.
'pause' Kirish oqimi to‘xtatilganda chiqariladi.
'resume' Kirish oqimi qayta boshlanganda chiqariladi.
'SIGCONT' Avval Ctrl+Z (SIGTSTP) bilan to‘xtatib qo‘yilgan Node.js jarayoni davom ettirilganda ishga tushadi.
'SIGINT' Ctrl+C bosilganda ishga tushadi (SIGINT deb ataladi).
'SIGTSTP' Ctrl+Z bosilganda ishga tushadi (SIGTSTP deb ataladi).
'history' Tarix har safar o‘zgarganda ishga tushadi.

Asosiy foydalanish misoli

Ushbu misol oddiy buyruq qatorini yaratish uchun Interface obyektidan asosiy foydalanishni ko‘rsatadi:

const readline = require('readline');

// Create interface for reading from stdin and writing to stdout
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

// Ask a question and get the user's input
rl.question('What is your name? ', (name) => {
  console.log(`Hello, ${name}!`);

  // Ask another question
  rl.question('How are you today? ', (response) => {
    console.log(`Glad to hear: ${response}`);
    
    // Close the interface
    rl.close();
  });
});

// Handle the close event
rl.on('close', () => {
  console.log('Interface closed. Goodbye!');
});
Misolni ishga tushirish »

Promise-ga asoslangan API misoli

Node.js v17+ o‘qish liniyasi uchun va’daga asoslangan API taqdim etadi:

// For Node.js v17 and above:
const readline = require('readline/promises');
const { stdin: input, stdout: output } = require('process');

async function askQuestions() {
  const rl = readline.createInterface({ input, output });

  try {
    // Ask questions sequentially
    const name = await rl.question('What is your name? ');
    console.log(`Hello, ${name}!`);

    const age = await rl.question('How old are you? ');
    console.log(`You are ${age} years old.`);

    const location = await rl.question('Where do you live? ');
    console.log(`${location} is a nice place!`);

    // Summary
    console.log('\nSummary:');
    console.log(`Name: ${name}`);
    console.log(`Age: ${age}`);
    console.log(`Location: ${location}`);
  } finally {
    // Make sure to close the interface
    rl.close();
  }
}

// Run the async function
askQuestions()
  .then(() => console.log('Questions completed!'))
  .catch(err => console.error('Error:', err));
Misolni ishga tushirish »

Buyruqlar qatori interfeysi misoli

Tarixni qo‘llab-quvvatlash bilan oddiy buyruq qatori interfeysini yaratish:

const readline = require('readline');
const fs = require('fs');
const path = require('path');

// History file path
const historyFile = path.join(__dirname, '.command_history');

// Load command history if it exists
let commandHistory = [];
try {
  if (fs.existsSync(historyFile)) {
    commandHistory = fs.readFileSync(historyFile, 'utf8')
      .split('\n')
      .filter(cmd => cmd.trim());
  }
} catch (err) {
  console.error('Error loading history:', err.message);
}

// Create the interface with custom configuration
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
  prompt: 'cli> ',
  historySize: 100,
  history: commandHistory
});

// Available commands
const commands = {
  help: () => {
    console.log('\nAvailable commands:');
    console.log('  help     - Show this help message');
    console.log('  hello    - Say hello');
    console.log('  date     - Show current date and time');
    console.log('  clear    - Clear the console');
    console.log('  exit     - Exit the CLI');
    rl.prompt();
  },
  hello: () => {
    console.log('Hello, world!');
    rl.prompt();
  },
  date: () => {
    console.log(new Date().toLocaleString());
    rl.prompt();
  },
  clear: () => {
    process.stdout.write('\x1Bc');
    rl.prompt();
  },
  exit: () => {
    // Save command history to file
    try {
      fs.writeFileSync(historyFile, rl.history.join('\n'));
      console.log(`Command history saved to ${historyFile}`);
    } catch (err) {
      console.error('Error saving history:', err.message);
    }
    
    console.log('Goodbye!');
    rl.close();
  }
};

// Display welcome message
console.log('Simple CLI Example');
console.log('Type "help" for available commands');

// Display the prompt
rl.prompt();

// Handle input
rl.on('line', (line) => {
  const input = line.trim();
  
  if (input === '') {
    rl.prompt();
    return;
  }
  
  const command = input.toLowerCase();
  
  if (commands[command]) {
    commands[command]();
  } else {
    console.log(`Command not found: ${input}`);
    console.log('Type "help" for available commands');
    rl.prompt();
  }
}).on('close', () => {
  process.exit(0);
});

// Handle Ctrl+C (SIGINT)
rl.on('SIGINT', () => {
  rl.question('Are you sure you want to exit? (y/n) ', (answer) => {
    if (answer.toLowerCase() === 'y') {
      commands.exit();
    } else {
      console.log('Operation cancelled');
      rl.prompt();
    }
  });
});
Misolni ishga tushirish »

Interaktiv parolni kiritish

Kiritilgan belgilarni yashiradigan parol kiritishni yaratish:

const readline = require('readline');

// Create the interface
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

// Function to prompt for masked input
function promptPassword(query) {
  return new Promise((resolve) => {
    // Create a hidden readline instance to control input/output
    const stdin = process.stdin;
    
    // Save the original configuration
    const originalStdinIsTTY = stdin.isTTY;
    if (originalStdinIsTTY) {
      stdin.setRawMode(true);
    }
    
    let password = '';
    
    // Write the query
    process.stdout.write(query);
    
    // Handle keypress events
    const onData = (key) => {
      // Ctrl+C
      if (key.toString() === '\u0003') {
        process.stdout.write('\n');
        process.exit();
      }
      
      // Enter key
      if (key.toString() === '\r' || key.toString() === '\n') {
        if (originalStdinIsTTY) {
          stdin.setRawMode(false);
        }
        stdin.removeListener('data', onData);
        process.stdout.write('\n');
        resolve(password);
        return;
      }
      
      // Backspace
      if (key.toString() === '\u0008' || key.toString() === '\u007f') {
        if (password.length > 0) {
          password = password.slice(0, -1);
          process.stdout.write('\b \b'); // Erase last character
        }
        return;
      }
      
      // Regular character
      password += key.toString();
      process.stdout.write('*'); // Show asterisk for each character
    };
    
    stdin.on('data', onData);
  });
}

// Example usage
async function login() {
  const username = await new Promise((resolve) => {
    rl.question('Username: ', (answer) => {
      resolve(answer);
    });
  });
  
  const password = await promptPassword('Password: ');
  
  console.log(`\nAttempting login for user: ${username}`);
  
  // Simulate authentication check
  if (username === 'admin' && password === 'password') {
    console.log('Login successful!');
  } else {
    console.log('Invalid username or password');
  }
  
  rl.close();
}

// Start the login process
login();
Misolni ishga tushirish »

Interaktiv menyuga misol

Variantlar bilan interaktiv menyu yaratish:

const readline = require('readline');

// Create the interface
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

// Menu options
const menuOptions = [
  { id: 1, name: 'View Profile' },
  { id: 2, name: 'Edit Settings' },
  { id: 3, name: 'Check Messages' },
  { id: 4, name: 'Log Out' },
  { id: 5, name: 'Exit' }
];

// Display the menu
function displayMenu() {
  console.log('\n===== MAIN MENU =====');
  menuOptions.forEach(option => {
    console.log(`${option.id}. ${option.name}`);
  });
  console.log('====================');
}

// Process the selected option
function processOption(option) {
  const selectedOption = menuOptions.find(item => item.id === parseInt(option));
  
  if (!selectedOption) {
    console.log('Invalid option. Please try again.');
    return promptUser();
  }
  
  console.log(`\nYou selected: ${selectedOption.name}`);
  
  // Handle each option
  switch (selectedOption.id) {
    case 1:
      console.log('Displaying user profile...');
      console.log('Name: John Doe');
      console.log('Email: john@example.com');
      console.log('Role: Administrator');
      break;
    case 2:
      console.log('Opening settings menu...');
      console.log('(Settings options would be displayed here)');
      break;
    case 3:
      console.log('Checking messages...');
      console.log('You have no new messages.');
      break;
    case 4:
      console.log('Logging out...');
      console.log('You have been logged out successfully.');
      return rl.close();
    case 5:
      console.log('Exiting the application...');
      return rl.close();
  }
  
  // Return to the menu after a short delay
  setTimeout(() => {
    promptUser();
  }, 1500);
}

// Prompt the user to select an option
function promptUser() {
  displayMenu();
  rl.question('Select an option: ', (answer) => {
    processOption(answer);
  });
}

// Start the menu
console.log('Welcome to the Interactive Menu Example');
promptUser();

// Handle close event
rl.on('close', () => {
  console.log('\nThank you for using the application!');
  process.exit(0);
});
Misolni ishga tushirish »

Eng yaxshi amaliyotlar

  1. Har doim interfeysni yoping: Resurslarni bo‘shatish uchun ish tugagach, rl.close() metodini chaqirishni unutmang.
  2. Ctrl+C tugmalarini ishlating: Dasturni to‘xtatib turish uchun “SIGINT” hodisasini tinglang.
  3. Promise-ga asoslangan API dan foydalaning: Node.js v17 va undan yuqori versiyalari uchun tozaroq asinxron kod uchun Promise-ga asoslangan APIdan foydalaning.
  4. Tarixni saqlash: CLI ilovalari uchun foydalanuvchi tajribasini yaxshilash uchun buyruqlar tarixini saqlang va tiklang.
  5. Xatolarni qayta ishlash: Foydalanuvchi bilan muloqot qilishda har doim yuzaga kelishi mumkin bo‘lgan xatolarni ko‘rib chiqing.
  6. Aniq ko‘rsatmalar bering: Ko‘rsatmalarda qanday turdagi kiritish kutilayotgani aniq ko‘rsatilganligiga ishonch hosil qiling.
  7. Kirilgan ma’lumotlarni tekshirish: Uni qayta ishlashdan oldin har doim foydalanuvchi kiritganini tasdiqlang.

W3Schools Pathfinder

Yutuqlaringizni kuzating – bu bepul!