Модуль readline Node.js
Node.jsreadlineмодуль представляет собой интерфейс для чтения данных строка за строкой из читаемого потока (такого какprocess.stdin). Он предоставляет простой способ обработки ввода командной строки и отлично подходит для создания интерактивных приложений командной строки.
Базовое использование
Импорт модуля readline
Чтобы использоватьreadlineмодуль, сначала нужно импортировать его:
Создайте интерфейс readline
Созданиеreadline.Interfaceэкземпляра — это основа использования этого модуля:
Пример
input: process.stdin,
output: process.stdout
});
Здесь мы создали интерфейс, который читает данные из стандартного ввода (клавиатуры) и записывает вывод в стандартный вывод (консоль).
Основные методы и события
Чтение ввода построчно
Используйтеquestion()метод, позволяющий задать пользователю вопрос и дождаться ответа:
Пример
console.log(`Привет, ${answer}!`);
rl.close();
});
Прослушивание события line
Когда пользователь вводит строку и нажимает Enter,lineсобытие срабатывает:
Пример
console.log(`Получено: ${input}`);
if (input === 'exit') {
rl.close();
}
});
Закрытие интерфейса
Используйтеclose()метод для закрытия интерфейса и освобождения ресурсов:
Пример
Когда интерфейс закрыт,closeсобытие срабатывает:
Пример
console.log('Goodbye!');
process.exit(0);
});
Расширенные функции
История
readlineМодуль поддерживает функциональность истории команд:
Пример
Пользователи могут использовать клавиши со стрелками вверх и вниз для просмотра истории команд.
Пользовательское автодополнение
Вы можете реализовать собственную функциональность автодополнения по клавише Tab:
Пример
const completions = ['help', 'exit', 'show'];
const hits = completions.filter((c) => c.startsWith(line));
return [hits.length ? hits : completions, line];
});
Управление курсором
readlineПредоставляет некоторые методы для управления курсором:
Пример
readline.clearLine(process.stdout, 0); // Очистить текущую строку
readline.clearScreenDown(process.stdout); // Очистить содержимое ниже курсора
Примеры практического применения
Создайте простую программу вопросов и ответов для командной строки
Пример
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
const questions = [
'Как вас зовут?',
'Сколько вам лет в этом году?',
'Какой ваш любимый язык программирования?'
];
const answers = [];
function askQuestion(i = 0) {
if (i >= questions.length) {
console.log('Спасибо за ваши ответы:', answers);
return rl.close();
}
rl.question(questions[i], (answer) => {
answers.push(answer);
askQuestion(i + 1);
});
}
askQuestion();
Создайте простой калькулятор командной строки
Пример
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
function calculator() {
rl.question('Пожалуйста, введите выражение (например, 2 + 3, или введите exit для выхода): ', (input) => {
if (input === 'exit') {
return rl.close();
}
try {
const result = eval(input); // Примечание: В реальных приложениях избегайте прямого использования eval
console.log(`Результат: ${result}`);
} catch (e) {
console.log('Недопустимое выражение');
}
calculator(); // Рекурсивный вызов для продолжения следующего вычисления
});
}
калькулятор();
Вопросы безопасности
Избегайте использования eval(): в примере калькулятора выше использовался
eval(), что небезопасно в продакшн-средах, поскольку он выполняет любой введённый JavaScript-код. В реальных приложениях следует использовать специализированный парсер выражений.Проверка входных данных: Всегда проверяйте пользовательский ввод, чтобы предотвратить инъекционные атаки или другие проблемы безопасности.
Обработка ошибок: Добавьте соответствующую обработку ошибок для всех асинхронных операций.
Итог
Node.jsreadlineмодуль — мощный инструмент для создания интерактивных инструментов командной строки. С его помощью мы можем:
- Легко получать пользовательский ввод
- Создавать интерактивные интерфейсы в стиле вопросов и ответов
- Реализовать историю команд
- Добавить функциональность автодополнения по Tab
- Управлять курсором терминала и выводом
ОсвойтеreadlineМодуль — важный шаг в разработке инструментов командной строки Node.js. Надеюсь, эта статья поможет вам понять и использовать этот модуль.
Встроенные модули Node.js