Модуль readline Node.js

Java FileВстроенные модули Node.js


Node.jsreadlineмодуль представляет собой интерфейс для чтения данных строка за строкой из читаемого потока (такого какprocess.stdin). Он предоставляет простой способ обработки ввода командной строки и отлично подходит для создания интерактивных приложений командной строки.


Базовое использование

Импорт модуля readline

Чтобы использоватьreadlineмодуль, сначала нужно импортировать его:

const readline = require('readline');

Создайте интерфейс readline

Созданиеreadline.Interfaceэкземпляра — это основа использования этого модуля:

Пример

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

Здесь мы создали интерфейс, который читает данные из стандартного ввода (клавиатуры) и записывает вывод в стандартный вывод (консоль).


Основные методы и события

Чтение ввода построчно

Используйтеquestion()метод, позволяющий задать пользователю вопрос и дождаться ответа:

Пример

rl.question('Как вас зовут?', (answer) => {
  console.log(`Привет, ${answer}!`);
  rl.close();
});

Прослушивание события line

Когда пользователь вводит строку и нажимает Enter,lineсобытие срабатывает:

Пример

rl.on('line', (input) => {
  console.log(`Получено: ${input}`);
  if (input === 'exit') {
    rl.close();
  }
});

Закрытие интерфейса

Используйтеclose()метод для закрытия интерфейса и освобождения ресурсов:

Пример

rl.close();

Когда интерфейс закрыт,closeсобытие срабатывает:

Пример

rl.on('close', () => {
  console.log('Goodbye!');
  process.exit(0);
});

Расширенные функции

История

readlineМодуль поддерживает функциональность истории команд:

Пример

rl.history = ['command1', 'command2'];  // Установить историю

Пользователи могут использовать клавиши со стрелками вверх и вниз для просмотра истории команд.

Пользовательское автодополнение

Вы можете реализовать собственную функциональность автодополнения по клавише Tab:

Пример

rl.on('completer', (line) => {
  const completions = ['help', 'exit', 'show'];
  const hits = completions.filter((c) => c.startsWith(line));
  return [hits.length ? hits : completions, line];
});

Управление курсором

readlineПредоставляет некоторые методы для управления курсором:

Пример

readline.cursorTo(process.stdout, 10, 5);  // Переместить курсор в столбец 10, строку 5
readline.clearLine(process.stdout, 0);     // Очистить текущую строку
readline.clearScreenDown(process.stdout);  // Очистить содержимое ниже курсора

Примеры практического применения

Создайте простую программу вопросов и ответов для командной строки

Пример

const readline = require('readline');

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 readline = require('readline');

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();  // Рекурсивный вызов для продолжения следующего вычисления
  });
}

калькулятор();

Вопросы безопасности

  1. Избегайте использования eval(): в примере калькулятора выше использовалсяeval(), что небезопасно в продакшн-средах, поскольку он выполняет любой введённый JavaScript-код. В реальных приложениях следует использовать специализированный парсер выражений.

  2. Проверка входных данных: Всегда проверяйте пользовательский ввод, чтобы предотвратить инъекционные атаки или другие проблемы безопасности.

  3. Обработка ошибок: Добавьте соответствующую обработку ошибок для всех асинхронных операций.


Итог

Node.jsreadlineмодуль — мощный инструмент для создания интерактивных инструментов командной строки. С его помощью мы можем:

  • Легко получать пользовательский ввод
  • Создавать интерактивные интерфейсы в стиле вопросов и ответов
  • Реализовать историю команд
  • Добавить функциональность автодополнения по Tab
  • Управлять курсором терминала и выводом

ОсвойтеreadlineМодуль — важный шаг в разработке инструментов командной строки Node.js. Надеюсь, эта статья поможет вам понять и использовать этот модуль.

Java FileВстроенные модули Node.js

Другие расширения