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