Readline javascript что это
Перейти к содержимому

Readline javascript что это

  • автор:

Readline¶

АПИ является удовлетворительным. Совместимость с NPM имеет высший приоритет и не будет нарушена кроме случаев явной необходимости.

Модуль node:readline предоставляет интерфейс для чтения данных из потока Readable (например, process.stdin ) по одной строке за раз.

Чтобы использовать API на основе обещаний:

import * as readline from 'node:readline/promises'; 
const readline = require('node:readline/promises'); 

Чтобы использовать API обратного вызова и синхронизации:

import * as readline from 'node:readline'; 
const readline = require('node:readline'); 

Следующий простой пример иллюстрирует базовое использование модуля node:readline .

 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
import * as readline from 'node:readline/promises'; import < stdin as input, stdout as output, >from 'node:process'; const rl = readline.createInterface(< input, output >); const answer = await rl.question( 'What do you think of Node.js? ' ); console.log( `Thank you for your valuable feedback: $` ); rl.close(); 
 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
const readline = require('node:readline'); const < stdin: input, stdout: output, >= require('node:process'); const rl = readline.createInterface(< input, output >); rl.question('What do you think of Node.js? ', (answer) => < // TODO: Log the answer in a database console.log( `Thank you for your valuable feedback: $` ); rl.close(); >); 

После вызова этого кода приложение Node.js не завершится, пока не будет закрыт readline.Interface , поскольку интерфейс ожидает получения данных в потоке input .

Class: InterfaceConstructor ¶

  • Extends:

Экземпляры класса InterfaceConstructor создаются с помощью метода readlinePromises.createInterface() или readline.createInterface() . Каждый экземпляр связан с одним потоком input Readable и одним потоком output Writable. Поток output используется для печати подсказок для пользовательского ввода, который поступает на поток input и считывается с него.

Событие: close ¶

Событие close возникает, когда происходит одно из следующих событий:

  • Вызывается метод rl.close() и экземпляр InterfaceConstructor теряет контроль над потоками input и output ;
  • Поток input получает событие ‘end’ ;
  • Поток вход получает Ctrl+D для сигнализации окончания передачи (EOT);
  • Поток input получает Ctrl+C для сигнала SIGINT и на экземпляре InterfaceConstructor не зарегистрирован слушатель события ‘SIGINT’ .

Функция слушателя вызывается без передачи каких-либо аргументов.

Экземпляр InterfaceConstructor завершается, как только произойдет событие ‘close’ .

Событие: ‘line’ ¶

Событие line возникает всякий раз, когда поток ввода получает ввод конца строки ( \n , \r или \r\n ). Обычно это происходит, когда пользователь нажимает Enter или Return.

Событие ‘line’ также испускается, если новые данные были прочитаны из потока, и этот поток заканчивается без маркера конца строки.

Функция слушателя вызывается со строкой, содержащей единственную строку полученного ввода.

1 2 3
rl.on('line', (input) =>  console.log(`Received: $input>`); >); 

Событие: history ¶

Событие ‘history’ генерируется всякий раз, когда массив истории изменяется.

Функция-слушатель вызывается с массивом, содержащим массив истории. В нем будут отражены все изменения, добавленные и удаленные строки благодаря historySize и removeHistoryDuplicates .

Основная цель — позволить слушателю сохранять историю. Слушатель также может изменять объект истории. Это может быть полезно для предотвращения добавления в историю определенных строк, например, пароля.

1 2 3
rl.on('history', (history) =>  console.log(`Received: $history>`); >); 

Событие: pause ¶

Событие pause возникает, когда происходит одно из следующих событий:

  • Поток input приостановлен.
  • Входной поток не приостановлен и получает событие ‘SIGCONT’ . (См. события ‘SIGTSTP’ и ‘SIGCONT’ ).

Функция слушателя вызывается без передачи каких-либо аргументов.

1 2 3
rl.on('pause', () =>  console.log('Readline paused.'); >); 

Событие: resume ¶

Событие ‘resume’ генерируется всякий раз, когда возобновляется поток ввода .

Функция слушателя вызывается без передачи каких-либо аргументов.

1 2 3
rl.on('resume', () =>  console.log('Readline resumed.'); >); 

Событие: ‘SIGCONT’ ¶

Событие SIGCONT возникает, когда процесс Node.js, ранее переведенный в фоновый режим с помощью Ctrl+Z (т.е. SIGTSTP ), затем возвращается на передний план с помощью fg(1p).

Если поток input был приостановлен до запроса SIGTSTP , это событие не будет выдано.

Функция слушателя вызывается без передачи каких-либо аргументов.

1 2 3 4
rl.on('SIGCONT', () =>  // `prompt` will automatically resume the stream rl.prompt(); >); 

Событие SIGCONT не поддерживается в Windows.

Событие: ‘SIGINT’ ¶

Событие ‘SIGINT’ генерируется всякий раз, когда поток ввода получает ввод Ctrl+C, известный обычно как SIGINT . Если нет зарегистрированных слушателей события ‘SIGINT’ , когда поток ввода получает SIGINT , будет выдано событие ‘pause’ .

Функция слушателя вызывается без передачи каких-либо аргументов.

1 2 3 4 5 6 7 8
rl.on('SIGINT', () =>  rl.question( 'Are you sure you want to exit? ', (answer) =>  if (answer.match(/^y(es)?$/i)) rl.pause(); > ); >); 

Событие: SIGTSTP ¶

Событие ‘SIGTSTP’ происходит, когда поток ввода получает входной сигнал Ctrl+Z, обычно известный как SIGTSTP . Если нет зарегистрированных слушателей события ‘SIGTSTP’ , когда поток ввода получает SIGTSTP , процесс Node.js будет отправлен в фоновый режим.

Когда программа будет возобновлена с помощью fg(1p), будут испущены события ‘pause’ и ‘SIGCONT’ . Они могут быть использованы для возобновления потока ввода .

События ‘pause’ и ‘SIGCONT’ не будут выдаваться, если входной поток был приостановлен до того, как процесс был отправлен в фон.

Функция слушателя вызывается без передачи каких-либо аргументов.

1 2 3 4 5
rl.on('SIGTSTP', () =>  // This will override SIGTSTP and prevent the program from going to the // background. console.log('Caught SIGTSTP.'); >); 

Событие ‘SIGTSTP’ не поддерживается в Windows.

rl.close() ¶

Метод rl.close() закрывает экземпляр InterfaceConstructor и передает контроль над потоками входа и выхода . При вызове будет выдано событие ‘close’ .

Вызов rl.close() не прекращает немедленно испускание других событий (включая ‘line’ ) экземпляром InterfaceConstructor .

rl.pause() .¶

Метод rl.pause() приостанавливает поток input , позволяя возобновить его позже, если это необходимо.

Вызов rl.pause() не приостанавливает немедленно другие события (включая ‘line’ ), испускаемые экземпляром InterfaceConstructor .

rl.prompt([preserveCursor]) .¶

  • preserveCursor Если true , предотвращает сброс установки курсора на 0 .

Метод rl.prompt() записывает экземпляры InterfaceConstructor , настроенные на prompt , на новую строку в output , чтобы предоставить пользователю новое место для ввода.

При вызове rl.prompt() возобновит поток ввода , если он был приостановлен.

Если InterfaceConstructor был создан с output , установленным в null или undefined , подсказка не будет записана.

rl.resume() .¶

Метод rl.resume() возобновляет поток input , если он был приостановлен.

rl.setPrompt(prompt) ¶

Метод rl.setPrompt() устанавливает подсказку, которая будет записываться в output при каждом вызове rl.prompt() .

rl.getPrompt() ¶

  • Возвращает: текущая строка подсказки

Метод rl.getPrompt() возвращает текущую подсказку, используемую rl.prompt() .

rl.write(data[, key]) ¶

  • data
  • key
    • ctrl true to indicate the Ctrl key.
    • meta true to indicate the Meta key.
    • shift true to indicate the Shift key.
    • name The name of the a key.

    Метод rl.write() записывает на выход либо данные , либо последовательность ключей, идентифицированную key . Аргумент key поддерживается только если output является текстовым терминалом TTY. Список комбинаций клавиш см. в TTY keybindings.

    Если указана key , data игнорируется.

    При вызове rl.write() возобновит поток input , если он был приостановлен.

    Если InterfaceConstructor был создан с output , установленным в null или undefined , то data и key не записываются.

    1 2 3
    rl.write('Delete this!'); // Simulate Ctrl+U to delete the line written previously rl.write(null,  ctrl: true, name: 'u' >); 

    Метод rl.write() запишет данные на вход интерфейса readline как если бы они были предоставлены пользователем.

    rl[Symbol.asyncIterator]() .¶

    • Возвращает:

    Создает объект AsyncIterator , который итерирует каждую строку во входном потоке как строку. Этот метод позволяет асинхронную итерацию объектов InterfaceConstructor через циклы for await. of .

    Ошибки во входном потоке не пересылаются.

    Если цикл завершается с помощью break , throw или return , будет вызван rl.close() . Другими словами, итерация по InterfaceConstructor всегда будет полностью потреблять входной поток.

    Производительность не соответствует традиционному API событий ‘line’ . Используйте ‘line’ вместо него для приложений, чувствительных к производительности.

     1 2 3 4 5 6 7 8 9 10
    async function processLineByLine()  const rl = readline.createInterface( // . >); for await (const line of rl)  // Each line in the readline input will be successively available here as // `line`. > > 

    После вызова readline.createInterface() начнет потреблять входной поток. Наличие асинхронных операций между созданием интерфейса и асинхронной итерацией может привести к пропуску строк.

    rl.line ¶

    Текущие входные данные, обрабатываемые узлом.

    Это может быть использовано при сборе входных данных из потока TTY для получения текущего значения, которое было обработано до того, как будет выдано событие line . После того, как событие line было вызвано, это свойство будет пустой строкой.

    Имейте в виду, что изменение значения во время выполнения экземпляра может иметь непредвиденные последствия, если rl.cursor также не контролируется.

    Если для ввода не используется поток TTY, используйте событие ‘line’ ..

    Один из возможных вариантов использования может быть следующим:

     1 2 3 4 5 6 7 8 9 10 11 12 13
    const values = ['lorem ipsum', 'dolor sit amet']; const rl = readline.createInterface(process.stdin); const showResults = debounce(() =>  console.log( '\n', values .filter((val) => val.startsWith(rl.line)) .join(' ') ); >, 300); process.stdin.on('keypress', (c, k) =>  showResults(); >); 

    rl.cursor ¶

    Позиция курсора относительно rl.line .

    Это позволяет отследить, где находится текущий курсор в строке ввода при чтении ввода из потока TTY. Позиция курсора определяет часть строки ввода, которая будет изменена при обработке ввода, а также столбец, в котором будет отображаться терминальный козырек.

    rl.getCursorPos() ¶

    • Возвращает:
      • rows строка подсказки, на которой в данный момент находится курсор
      • cols столбец экрана, на котором в данный момент находится курсор

      Возвращает реальную позицию курсора по отношению к строке + подсказке ввода. Длинные строки ввода (обертка), а также многострочные подсказки включаются в вычисления.

      Обещания API¶

      Стабильность: 1 – Экспериментальная

      Класс: readlinePromises.Interface ¶

      • Расширяет:

      Экземпляры класса readlinePromises.Interface создаются с помощью метода readlinePromises.createInterface() . Каждый экземпляр связан с одним потоком input Readable и одним потоком output Writable. Поток output используется для печати подсказок для пользовательского ввода, который поступает на поток input и считывается с него.

      rl.question(query[, options]) ¶

      Метод rl.question() отображает запрос , записывая его в вывод , ожидает ввода данных пользователем в ввод , затем вызывает функцию обратный вызов , передавая введенные данные в качестве первого аргумента.

      При вызове rl.question() возобновит поток input , если он был приостановлен.

      Если readlinePromises.Interface был создан с output , установленным на null или undefined , то query не записывается.

      Если вопрос вызывается после rl.close() , он возвращает отклоненное обещание.

      1 2 3 4
      const answer = await rl.question( 'What is your favorite food? ' ); console.log(`Oh, so your favorite food is $`); 

      Использование сигнала AbortSignal для отмены вопроса.

       1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
      const signal = AbortSignal.timeout(10_000); signal.addEventListener( 'abort', () => < console.log('The food question timed out'); >, < once: true >); const answer = await rl.question( 'What is your favorite food? ', < signal >); console.log(`Oh, so your favorite food is $`); 

      Класс: readlinePromises.Readline .¶

      новый readlinePromises.Readline(stream[, options]) .¶
      • stream TTY поток.
      • options
        • autoCommit Если true , не нужно вызывать rl.commit() .
        rl.clearLine(dir) .¶

        Метод rl.clearLine() добавляет во внутренний список ожидающих выполнения действий действие, которое очищает текущую строку связанного с ней потока в указанном направлении, обозначенном dir . Вызовите rl.commit() , чтобы увидеть эффект этого метода, если только autoCommit: true не было передано в конструктор.

        rl.clearScreenDown() .¶
        • Возвращает: this

        Метод rl.clearScreenDown() добавляет во внутренний список ожидающих действий действие, которое очищает связанный поток от текущей позиции курсора вниз. Вызовите rl.commit() , чтобы увидеть эффект этого метода, если только autoCommit: true не было передано в конструктор.

        rl.commit() .¶
        • Возвращает:

        Метод rl.commit() отправляет все отложенные действия в связанный поток и очищает внутренний список отложенных действий.

        rl.cursorTo(x[, y]) .¶
        • x
        • y
        • Возвращает: this

        Метод rl.cursorTo() добавляет во внутренний список ожидающих действий действие, которое перемещает курсор в указанную позицию в связанном потоке . Вызовите rl.commit() , чтобы увидеть эффект этого метода, если только autoCommit: true не было передано в конструктор.

        rl.moveCursor(dx, dy) .¶
        • dx
        • dy
        • Возвращает: this

        Метод rl.moveCursor() добавляет во внутренний список ожидающих выполнения действий действие, которое перемещает курсор относительно его текущей позиции в связанном потоке . Вызовите rl.commit() , чтобы увидеть эффект этого метода, если только autoCommit: true не было передано в конструктор.

        rl.rollback() .¶
        • Возвращает: this

        Методы rl.rollback очищают внутренний список ожидающих действий без отправки его в связанный поток .

        readlinePromises.createInterface(options) ¶

        • options
          • вход Поток Readable, который нужно слушать. Этот параметр обязателен.
          • output Поток Writable для записи данных readline.
          • completer Необязательная функция, используемая для автодополнения табуляции.
          • терминал true , если потоки ввода и вывода должны рассматриваться как TTY, и в них должны записываться коды ANSI/VT100. По умолчанию: проверка isTTY на потоке output при инстанцировании.
          • history Начальный список строк истории. Эта опция имеет смысл только если terminal установлен в true пользователем или внутренней проверкой output , иначе механизм кэширования истории не инициализируется вообще. По умолчанию: [] .
          • historySize Максимальное количество сохраняемых строк истории. Чтобы отключить историю, установите это значение в 0 . Эта опция имеет смысл, только если terminal установлен в true пользователем или внутренней проверкой output , иначе механизм кэширования истории вообще не инициализируется. По умолчанию: 30 .
          • removeHistoryDuplicates Если true , когда новая строка ввода, добавленная в список истории, дублирует более старую строку, это удаляет более старую строку из списка. По умолчанию: false .
          • prompt Используемая строка подсказки. По умолчанию: `’>«.
          • crlfDelay Если задержка между \r и \n превышает crlfDelay миллисекунд, то и \r и \n будут рассматриваться как отдельный ввод конца строки. crlfDelay будет приведен к числу не менее 100 . Оно может быть установлено в бесконечность , в этом случае \r , за которым следует \n , всегда будет считаться одной новой строкой (что может быть разумно для чтения файлов с \r\n разделителем строк). По умолчанию: 100 .
          • escapeCodeTimeout Продолжительность, в течение которой readlinePromises будет ожидать символа (при чтении неоднозначной последовательности клавиш в миллисекундах, которая может как сформировать полную последовательность клавиш, используя прочитанный на данный момент ввод, так и принять дополнительный ввод для завершения более длинной последовательности клавиш). По умолчанию: 500 .
          • tabSize Количество пробелов, которым равна табуляция (минимум 1). По умолчанию: 8 .

          Метод readlinePromises.createInterface() создает новый экземпляр readlinePromises.Interface .

          1 2 3 4 5
          const readlinePromises = require('node:readline/promises'); const rl = readlinePromises.createInterface( input: process.stdin, output: process.stdout, >); 

          После создания экземпляра readlinePromises.Interface , наиболее распространенным случаем является прослушивание события ‘line’ :

          1 2 3
          rl.on('line', (line) =>  console.log(`Received: $line>`); >); 

          Если terminal является true для данного экземпляра, то поток output получит наилучшую совместимость, если он определит свойство output.columns и испустит событие ‘resize’ на output , если или когда колонки когда-либо изменятся ( process.stdout делает это автоматически, если это TTY).

          Использование функции completer .¶

          Функция completer принимает в качестве аргумента текущую строку, введенную пользователем, и возвращает Array с 2 записями:

          • Массив Array с соответствующими записями для завершения.
          • Подстрока, которая была использована для сопоставления.

          Например: [[substr1, substr2, . ], originalsubstring] .

           1 2 3 4 5 6 7 8 9 10
          function completer(line)  const completions = '.help .error .exit .quit .q'.split( ' ' ); const hits = completions.filter((c) => c.startsWith(line) ); // Show all completions if none found return [hits.length ? hits : completions, line]; > 

          Функция completer может также возвращать или быть асинхронной:

          1 2 3 4
          async function completer(linePartial)  await someAsyncWork(); return [['123'], linePartial]; > 

          API обратного вызова¶

          Класс: readline.Interface ¶

          • Расширяет:

          Экземпляры класса readline.Interface создаются с помощью метода readline.createInterface() . Каждый экземпляр связан с одним потоком input Readable и одним потоком output Writable. Поток output используется для печати подсказок для пользовательского ввода, который поступает на поток input и считывается с него.

          rl.question(query[, options], callback) .¶

          Метод rl.question() отображает запрос , записывая его на вывод , ждет ввода данных пользователем на вводе , затем вызывает функцию обратного вызова , передавая введенные данные в качестве первого аргумента.

          После вызова rl.question() возобновит поток input , если он был приостановлен.

          Если readline.Interface был создан с output , установленным в null или undefined , то query не записывается.

          Функция callback , передаваемая в rl.question() , не следует типичной схеме принятия объекта Error или null в качестве первого аргумента. Функция callback вызывается с предоставленным ответом в качестве единственного аргумента.

          При вызове rl.question() после rl.close() произойдет ошибка.

          1 2 3
          rl.question('What is your favorite food? ', (answer) =>  console.log(`Oh, so your favorite food is $answer>`); >); 

          Использование AbortController для отмены вопроса.

           1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
          const ac = new AbortController(); const signal = ac.signal; rl.question( 'What is your favorite food? ',  signal >, (answer) =>  console.log( `Oh, so your favorite food is $answer>` ); > ); signal.addEventListener( 'abort', () =>  console.log('The food question timed out'); >,  once: true > ); setTimeout(() => ac.abort(), 10000); 

          readline.clearLine(stream, dir[, callback]) ¶

          • stream
          • dir
            • -1 : влево от курсора
            • 1 : вправо от курсора
            • 0 : вся строка

            Метод readline.clearLine() очищает текущую строку данного потока TTY в указанном направлении, обозначенном dir .

            readline.clearScreenDown(stream[, callback]) .¶

            • stream
            • callback Вызывается по завершении операции.
            • Возвращает: false , если stream хочет, чтобы вызывающий код дождался события ‘drain’ , прежде чем продолжить запись дополнительных данных; иначе true .

            Метод readline.clearScreenDown() очищает данный поток TTY от текущей позиции курсора вниз.

            readline.createInterface(options) .¶

            • options
              • input Поток Readable, который нужно слушать. Этот параметр обязателен.
              • output Поток Writable для записи данных readline.
              • completer Необязательная функция, используемая для автодополнения табуляции.
              • терминал true , если потоки ввода и вывода должны рассматриваться как TTY, и в них должны записываться коды ANSI/VT100. По умолчанию: проверка isTTY на потоке output при инстанцировании.
              • history Начальный список строк истории. Эта опция имеет смысл только если terminal установлен в true пользователем или внутренней проверкой output , иначе механизм кэширования истории не инициализируется вообще. По умолчанию: [] .
              • historySize Максимальное количество сохраняемых строк истории. Чтобы отключить историю, установите это значение в 0 . Эта опция имеет смысл только если terminal установлен в true пользователем или внутренней проверкой output , иначе механизм кэширования истории не инициализируется вообще. По умолчанию: 30 .
              • removeHistoryDuplicates Если true , когда новая входная строка, добавленная в список истории, дублирует более старую, это удаляет более старую строку из списка. По умолчанию: false .
              • prompt Используемая строка подсказки. По умолчанию: `’>«.
              • crlfDelay Если задержка между \r и \n превышает crlfDelay миллисекунд, то и \r и \n будут рассматриваться как отдельный ввод конца строки. crlfDelay будет приведен к числу не менее 100 . Оно может быть установлено в бесконечность , в этом случае \r , за которым следует \n , всегда будет считаться одной новой строкой (что может быть разумно для чтения файлов с \r\n разделителем строк). По умолчанию: 100 .
              • escapeCodeTimeout Продолжительность readline будет
              • tabSize Количество пробелов, которым равна табуляция (минимум 1). По умолчанию: 8 .
              • signal Позволяет закрыть интерфейс с помощью сигнала AbortSignal. Прерывание сигнала приведет к внутреннему вызову close на интерфейсе.

              Метод readline.createInterface() создает новый экземпляр readline.Interface .

              1 2 3 4 5
              const readline = require('node:readline'); const rl = readline.createInterface( input: process.stdin, output: process.stdout, >); 

              После создания экземпляра readline.Interface , наиболее распространенным случаем является прослушивание события ‘line’ :

              1 2 3
              rl.on('line', (line) =>  console.log(`Received: $line>`); >); 

              Если terminal для данного экземпляра имеет значение true , то поток output получит наилучшую совместимость, если он определит свойство output.columns и выдаст событие ‘resize’ на output , если или когда колонки когда-либо изменятся ( process.stdout делает это автоматически, если это TTY).

              При создании readline.Interface с использованием stdin в качестве входных данных, программа не завершится, пока не получит символ EOF. Чтобы выйти, не дожидаясь ввода данных пользователем, вызовите process.stdin.unref() .

              Использование функции completer ¶

              Функция completer принимает в качестве аргумента текущую строку, введенную пользователем, и возвращает Array с 2 записями:

              • Массив Array с соответствующими записями для завершения.
              • Подстрока, которая была использована для сопоставления.

              Например: [[substr1, substr2, . ], originalsubstring] .

               1 2 3 4 5 6 7 8 9 10
              function completer(line)  const completions = '.help .error .exit .quit .q'.split( ' ' ); const hits = completions.filter((c) => c.startsWith(line) ); // Show all completions if none found return [hits.length ? hits : completions, line]; > 

              Функция completer может быть вызвана асинхронно, если она принимает два аргумента:

              1 2 3
              function completer(linePartial, callback)  callback(null, [['123'], linePartial]); > 

              readline.cursorTo(stream, x[, y][, callback]) .¶

              • stream
              • x
              • y
              • callback Вызывается после завершения операции.
              • Возвращает: false , если stream хочет, чтобы вызывающий код дождался события ‘drain’ , прежде чем продолжить запись дополнительных данных; иначе true .

              Метод readline.cursorTo() перемещает курсор в указанную позицию в данном TTY потоке .

              readline.moveCursor(stream, dx, dy[, callback]) .¶

              • stream
              • dx
              • dy
              • callback Вызывается после завершения операции.
              • Возвращает: false , если stream хочет, чтобы вызывающий код дождался события ‘drain’ , прежде чем продолжить запись дополнительных данных; иначе true .

              Метод readline.moveCursor() перемещает курсор относительно его текущей позиции в данном TTY потоке .

              readline.emitKeypressEvents(stream[, interface]) .¶

              • поток
              • интерфейс

              Метод readline.emitKeypressEvents() заставляет данный поток Readable начать испускать события ‘keypress’ , соответствующие полученным входным данным.

              Опционально, interface указывает экземпляр readline.Interface , для которого отключается автозавершение при обнаружении копируемого ввода.

              Если stream является TTY, то он должен быть в режиме raw.

              Это автоматически вызывается любым экземпляром readline на его входе , если входом является терминал. Закрытие экземпляра readline не прекращает испускание input событий ‘keypress’ .

              readline.emitKeypressEvents(process.stdin); if (process.stdin.isTTY) process.stdin.setRawMode(true); 

              Пример: Маленький интерфейс командной строки¶

              Следующий пример иллюстрирует использование класса readline.Interface для реализации небольшого интерфейса командной строки:

               1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
              const readline = require('node:readline'); const rl = readline.createInterface( input: process.stdin, output: process.stdout, prompt: 'OHAI> ', >); rl.prompt(); rl.on('line', (line) =>  switch (line.trim())  case 'hello': console.log('world!'); break; default: console.log( `Say what? I might have heard '$line.trim()>'` ); break; > rl.prompt(); >).on('close', () =>  console.log('Have a great day!'); process.exit(0); >); 

              Пример: Чтение потока файлов построчно¶

              Обычный случай использования readline — это потребление входного файла по одной строке за раз. Самый простой способ сделать это — использовать API fs.ReadStream , а также цикл for await. of :

               1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
              const fs = require('node:fs'); const readline = require('node:readline'); async function processLineByLine()  const fileStream = fs.createReadStream('input.txt'); const rl = readline.createInterface( input: fileStream, crlfDelay: Infinity, >); // Note: we use the crlfDelay option to recognize all instances of CR LF // ('\r\n') in input.txt as a single line break. for await (const line of rl)  // Each line in input.txt will be successively available here as `line`. console.log(`Line from file: $line>`); > > processLineByLine(); 

              В качестве альтернативы можно использовать событие ‘line’ :

               1 2 3 4 5 6 7 8 9 10 11
              const fs = require('node:fs'); const readline = require('node:readline'); const rl = readline.createInterface( input: fs.createReadStream('sample.txt'), crlfDelay: Infinity, >); rl.on('line', (line) =>  console.log(`Line from file: $line>`); >); 

              В настоящее время цикл for await. of может быть немного медленнее. Если поток async / await и скорость важны одновременно, можно применить смешанный подход:

               1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
              const  once > = require('node:events'); const  createReadStream > = require('node:fs'); const  createInterface > = require('node:readline'); (async function processLineByLine()  try  const rl = createInterface( input: createReadStream('big-file.txt'), crlfDelay: Infinity, >); rl.on('line', (line) =>  // Process the line. >); await once(rl, 'close'); console.log('File processed.'); > catch (err)  console.error(err); > >)(); 

              TTY keybindings¶

              Keybindings Description Notes
              Ctrl + Shift + Backspace Delete line left Doesn’t work on Linux, Mac and Windows
              Ctrl + Shift + Delete Delete line right Doesn’t work on Mac
              Ctrl + C Emit SIGINT or close the readline instance
              Ctrl + H Delete left
              Ctrl + D Delete right or close the readline instance in case the current line is empty / EOF Doesn’t work on Windows
              Ctrl + U Delete from the current position to the line start
              Ctrl + K Delete from the current position to the end of line
              Ctrl + Y Yank (Recall) the previously deleted text Only works with text deleted by Ctrl + U or Ctrl + K
              Meta + Y Cycle among previously deleted lines Only available when the last keystroke is Ctrl + Y
              Ctrl + A Go to start of line
              Ctrl + E Go to end of line
              Ctrl + B Back one character
              Ctrl + F Forward one character
              Ctrl + L Clear screen
              Ctrl + N Next history item
              Ctrl + P Previous history item
              Ctrl + — Undo previous change Any keystroke that emits key code 0x1F will do this action. In many terminals, for example xterm , this is bound to Ctrl + — .
              Ctrl + 6 Redo previous change Many terminals don’t have a default redo keystroke. We choose key code 0x1E to perform redo. In xterm , it is bound to Ctrl + 6 by default.
              Ctrl + Z Moves running process into background. Type fg and press Enter to return. Doesn’t work on Windows
              Ctrl + W or Ctrl + Backspace Delete backward to a word boundary Ctrl + Backspace Doesn’t work on Linux, Mac and Windows
              Ctrl + Delete Delete forward to a word boundary Doesn’t work on Mac
              Ctrl + Left arrow or Meta + B Word left Ctrl + Left arrow Doesn’t work on Mac
              Ctrl + Right arrow or Meta + F Word right Ctrl + Right arrow Doesn’t work on Mac
              Meta + D or Meta + Delete Delete word right Meta + Delete Doesn’t work on windows
              Meta + Backspace Delete word left Doesn’t work on Mac

              Модуль Readline

              Ознакомится с модулем Readline и его основными методами.

              Предварительныетребования

              Установленны Node.js и npm

              Умение работать с модулями Node.js

              Определение и использование

              Модуль Readline предоставляет интерфейс для чтения данных из Readable потока (например, process.stdin) по одной строке за раз. Для его подключения необходимо выполнить команду require(‘readline’) .

              Экземпляры класса readline.Interface построены с использованием метода readline.createInterface(options). Каждый экземпляр связан с одним входным ( input ) Readable потоком и одним выходным ( output ) Writable потоком. Поток output используется для вывода на экран приглашения ввода данных пользователем, которые поступают и считываются с input потока.

              В процессе работы модуля генерируются несколько событий:

              • Событие ‘close’ вызывается если вызван метод rl.close(), закончился входной поток или была нажата одна из комбинаций клавиш -D или -C
              • Событие ‘line’ выводится всякий раз, когда входной поток получает конец строки ( \n , \r или \r\n )
              • Событие ‘pause’ вызывается, когда входной поток был переостановлен
              • Событие ‘resume’ генерируется, когда возобновляется поток input.
              • Событие ‘SIGCONT’ генерируется, если процесс Node.js был предварительно перемещен в фоновый режим через -Z и при это поток input не был преостановлен
              • Событие ‘SIGINT’ генерируется, когда стрим input получает ввод -C, известный, как SIGINT

              Класса readline.Interface содержит несколько методов. Основные приведены в таблице ниже, с остальными ,как и сметодами самого модуля можно ознакомится в документации

              Метод Описание
              rl.close() Закрывает экземпляр readline.Interface
              rl.prompt([preserveCursor]) Выводит настроенный prompt на новую строку в output и ожидает дальнейших действий от пользователя
              rl.question(query, callback) Отображает query в output, ожидает ответ от пользователя, затем вызывает функцию callback, которая передает предоставленные пользователем данные в качестве первого аргумента.
              rl.setPrompt(prompt) Устанавливает prompt, который будет записан в output каждый раз, когда вызывается rl.prompt().
              rl.write(data, [, key]) Метод rl.write() записывает data либо последовательность ключей, определенных key. Если key задан, data игнорируется.
              const rl = require('readline'); const rl = readline.createInterface(< input: process.stdin, output: process.stdout >); r.question("What do you think of node.js?", function(answer) < console.log("Thank you for your valuable feedback."); r.close(); >); 

              Практическое задание

              Выведите в консоль два вопроса и после ответов на оба, вывидите полученную информцию.

              Глоссарий

              Термин Значение
              Prompt В контексте данного урока это понятие означает знак или текст, который служит символом начала команды в интерфейсе командной строки

              Как с помощью readline в JavaScript создать массив объектов и выполнить поиск типа ключ значение?

              Нужно чтобы пользователь мог через консоль сначала внести имя и возраст, затем должна быть возможность при введении возраста получить имя. Что-то по типу этого только я не могу понять как через одну строку внести несколько параметров объекта. Или можно ка-то по другому реализовать данный функционал

              const readline = require('readline'); const reader = readline.createInterface(< input: process.stdin, output: process.stdout >); let a = [ , < name:"leha", age:'20'>, ]; console.log('give me age') reader.on('line', function (line) < const input = line const find = a.find(a =>a.age === input) console.log(find) > )
              • Вопрос задан более трёх лет назад
              • 1868 просмотров

              8 комментариев

              Простой 8 комментариев

              Readline

              Модуль node:readline предоставляет интерфейс для чтения данных из потока Readable (например, process.stdin ) по одной строке за раз.

              Чтобы использовать APIs: на базе promise

              import * as readline from 'node:readline/promises';
              const readline = require('node:readline/promises');

              Чтобы использовать обратный вызов и синхронизировать APIs:

              import * as readline from 'node:readline';
              const readline = require('node:readline');

              Следующий простой пример иллюстрирует базовое использование модуля node:readline .

              import * as readline from 'node:readline/promises'; import < stdin as input, stdout as output > from 'node:process'; const rl = readline.createInterface(< input, output >); const answer = await rl.question('What do you think of Node.js? '); console.log(`Thank you for your valuable feedback: $ `); rl.close();
              const readline = require('node:readline'); const < stdin: input, stdout: output > = require('node:process'); const rl = readline.createInterface(< input, output >); rl.question('What do you think of Node.js? ', (answer) => < // TODO: Заносим ответ в базу данных console.log(`Thank you for your valuable feedback: $ `); rl.close(); >);

              После вызова этого кода приложение Node.js не завершится до тех пор, пока readline.Interface не будет закрыт, поскольку интерфейс ожидает получения данных в потоке input .

              Class: InterfaceConstructor

              Добавлено: v0.1.104

              • Extends:

              Экземпляры класса InterfaceConstructor создаются с использованием метода readlinePromises.createInterface() или readline.createInterface() . Каждый экземпляр связан с одним потоком input Readable и одним потоком output Writable . Поток output используется для печати подсказок для пользовательского ввода, который поступает и считывается из потока input .

              Event: ‘close’

              Добавлено: v0.1.98

              Событие ‘close’ генерируется при возникновении одного из следующих событий:

              • Вызывается метод rl.close() , и экземпляр InterfaceConstructor отказывается от управления потоками input и output ;
              • Поток input получает событие ‘end’ ;
              • Поток input получает Ctrl + D сигнализировать об окончании передачи (EOT);
              • Поток input получает Ctrl + C для подачи сигнала SIGINT , а на экземпляре InterfaceConstructor не зарегистрирован прослушиватель событий ‘SIGINT’ .

              Функция прослушивателя вызывается без передачи каких-либо аргументов.

              Экземпляр InterfaceConstructor завершается после генерации события ‘close’ .

              Event: ‘line’

              Добавлено: v0.1.98

              Событие ‘line’ генерируется всякий раз, когда поток input получает входные данные конца строки ( \n , \r или \r\n ). Обычно это происходит, когда пользователь нажимает Enter or Return .

              Событие ‘line’ также генерируется, если из потока были прочитаны новые данные и этот поток заканчивается без последнего маркера конца строки.

              Функция прослушивателя вызывается со строкой, содержащей одну строку полученного ввода.

              rl.on('line', (input) => < console.log(`Received: $ `); >);
              Event: ‘history’

              Добавлено: v15.8.0, v14.18.0

              Событие ‘history’ генерируется всякий раз, когда массив истории изменяется.

              Функция прослушивателя вызывается с массивом, содержащим массив истории. В нем будут отражены все изменения, добавленные и удаленные строки, связанные с historySize и removeHistoryDuplicates .

              Основная цель — позволить слушателю сохранить историю. Слушатель также может изменить объект истории. Это может быть полезно для предотвращения добавления в историю определенных строк, например пароля.

              rl.on('history', (history) => < console.log(`Received: $ `); >);
              Event: ‘pause’

              Добавлено: v0.7.5

              Событие ‘pause’ генерируется при возникновении одного из следующих событий:

              • Поток input приостановлен.
              • Поток input не приостанавливается и получает событие ‘SIGCONT’ . В5031В события К1482К и Л2646Л.)

              Функция прослушивателя вызывается без передачи каких-либо аргументов.

              rl.on('pause', () => < console.log('Readline paused.'); >);
              Event: ‘resume’

              Добавлено: v0.7.5

              Событие ‘resume’ генерируется всякий раз, когда возобновляется поток input .

              Функция прослушивателя вызывается без передачи каких-либо аргументов.

              rl.on('resume', () => < console.log('Readline resumed.'); >);
              Event: ‘SIGCONT’

              Добавлено: v0.7.5

              Событие ‘SIGCONT’ генерируется, когда процесс Node.js ранее был переведен в фоновый режим с помощью Ctrl + Z (i.e. SIGTSTP ) затем возвращается на передний план с помощью fg(1p) .

              Если поток input был приостановлен до запроса SIGTSTP , это событие не будет создано.

              Функция прослушивателя вызывается без передачи каких-либо аргументов.

              rl.on('SIGCONT', () => < // `prompt` автоматически возобновит поток rl.prompt(); >);

              Событие ‘SIGCONT’ не поддерживается в Windows.

              Event: ‘SIGINT’

              Добавлено: v0.3.0

              Событие ‘SIGINT’ генерируется всякий раз, когда поток input получает Ctrl+C вход, обычно известный как SIGINT . Если не зарегистрировано прослушивателей событий ‘SIGINT’ , когда поток input получает SIGINT , будет создано событие ‘pause’ .

              Функция прослушивателя вызывается без передачи каких-либо аргументов.

              rl.on('SIGINT', () => < rl.question('Are you sure you want to exit? ', (answer) => < if (answer.match(/^y(es)?$/i)) rl.pause(); >); >);
              Event: ‘SIGTSTP’

              Добавлено: v0.7.5

              Событие ‘SIGTSTP’ генерируется, когда поток input получает Ctrl + Z вход, обычно известный как SIGTSTP . Если не зарегистрировано прослушивателей событий ‘SIGTSTP’ , когда поток input получает SIGTSTP , процесс Node.js будет отправлен в фоновый режим.

              Когда программа возобновляется с использованием fg(1p) , будут генерироваться события ‘pause’ и ‘SIGCONT’ . Их можно использовать для возобновления потока input .

              События ‘pause’ и ‘SIGCONT’ не будут генерироваться, если input был приостановлен перед отправкой процесса в фоновый режим.

              Функция прослушивателя вызывается без передачи каких-либо аргументов.

              rl.on('SIGTSTP', () => < // Это переопределит SIGTSTP и не позволит программе перейти к // background. console.log('Caught SIGTSTP.'); >);

              Событие ‘SIGTSTP’ не поддерживается в Windows.

              rl.close()

              Добавлено: v0.1.98

              Метод rl.close() закрывает экземпляр InterfaceConstructor и отказывается от управления потоками input и output . При вызове будет генерироваться событие ‘close’ .

              Вызов rl.close() не останавливает немедленно создание других событий (включая ‘line’ ) экземпляром InterfaceConstructor .

              rl.pause()

              Добавлено: v0.3.4

              Метод rl.pause() приостанавливает поток input , позволяя при необходимости возобновить его позже.

              Вызов rl.pause() не приостанавливает немедленно отправку других событий (включая ‘line’ ) экземпляром InterfaceConstructor .

              rl.prompt([preserveCursor])

              Добавлено: v0.1.98

              • preserveCursor Если true , предотвращает сброс положения курсора на 0 .

              Метод rl.prompt() записывает экземпляры InterfaceConstructor , настроенные prompt , в новую строку в output , чтобы предоставить пользователю новое место для ввода данных.

              При вызове rl.prompt() возобновит поток input , если он был приостановлен.

              Если InterfaceConstructor был создан с output , установленным на null или undefined , подсказка не записывается.

              rl.resume()

              Добавлено: v0.3.4

              Метод rl.resume() возобновляет поток input , если он был приостановлен.

              rl.setPrompt(prompt)

              Добавлено: v0.1.98

              Метод rl.setPrompt() устанавливает приглашение, которое будет записываться в output при каждом вызове rl.prompt() .

              rl.getPrompt()

              Добавлено: v15.3.0, v14.17.0

              • Возвращает: текущая строка приглашения.

              Метод rl.getPrompt() возвращает текущее приглашение, используемое rl.prompt() .

              rl.write(data[, key])

              Добавлено: v0.1.98

              • data
              • key
                • ctrl true для обозначения Ctrl key.
                • meta true для обозначения Meta key.
                • shift true для обозначения Shift key.
                • name Имя ключа.

                Метод rl.write() записывает либо data , либо последовательность ключей, идентифицированную key , в output . Аргумент key поддерживается только в том случае, если output является текстовым терминалом TTY . См. TTY keybindings для получения списка комбинаций клавиш.

                Если указан key , data игнорируется.

                При вызове rl.write() возобновит поток input , если он был приостановлен.

                Если InterfaceConstructor был создан с output , установленным на null или undefined , data и key не записываются.

                rl.write('Delete this!'); // Имитируем Ctrl+U, чтобы удалить написанную ранее строку rl.write(null, < ctrl: true, name: 'u' >);

                Метод rl.write() запишет данные в input readline Interface , как если бы они были предоставлены пользователем.

                rl[Symbol.asyncIterator]()

                Добавлено: v11.4.0, v10.16.0

                Поддержка Symbol.asyncIterator больше не является экспериментальной.

                • Returns:

                Создайте объект AsyncIterator , который перебирает каждую строку входного потока как строку. Этот метод позволяет выполнять асинхронную итерацию объектов InterfaceConstructor через циклы for await. of .

                Ошибки во входном потоке не пересылаются.

                Если цикл завершается с помощью break , throw или return , будет вызван rl.close() . Другими словами, итерация InterfaceConstructor всегда будет полностью поглощать входной поток.

                Производительность не соответствует традиционному событию ‘line’ API.. Вместо этого используйте ‘line’ для приложений, чувствительных к производительности.

                async function processLineByLine() < const rl = readline.createInterface(< // . >); for await (const line of rl) < // Каждая строка ввода readline будет последовательно доступна здесь как // `line`. > >

                readline.createInterface() начнет потреблять входной поток после вызова. Наличие асинхронных операций между созданием интерфейса и асинхронной итерацией может привести к пропущенным строкам.

                rl.line

                Значение всегда будет строкой, никогда не неопределенной.

                Текущие входные данные, обрабатываемые узлом.

                Это можно использовать при сборе входных данных из потока TTY для получения текущего значения, которое было обработано до момента создания события line . После создания события line это свойство будет пустой строкой.

                Имейте в виду, что изменение значения во время выполнения экземпляра может иметь непредвиденные последствия, если rl.cursor также не контролируется.

                Если для ввода не используется поток TTY, используйте событие ‘line’ .

                Один из возможных вариантов использования может быть следующим:

                const values = ['lorem ipsum', 'dolor sit amet']; const rl = readline.createInterface(process.stdin); const showResults = debounce(() => < console.log( '\n', values.filter((val) => val.startsWith(rl.line)).join(' ') ); >, 300); process.stdin.on('keypress', (c, k) => < showResults(); >);
                rl.cursor

                Добавлено: v0.1.98

                Позиция курсора относительно rl.line .

                Это позволит отслеживать, где находится текущий курсор во входной строке при чтении входных данных из потока TTY. Положение курсора определяет часть входной строки, которая будет изменена по мере обработки ввода, а также столбец, в котором будет отображаться курсор терминала.

                rl.getCursorPos()

                Добавлено: v13.5.0, v12.16.0

                • Returns:
                  • rows строка подсказки, на которой в данный момент находится курсор
                  • cols столбец экрана, на котором в данный момент находится курсор

                  Возвращает реальную позицию курсора относительно ввода приглашения + строки. В вычисления включаются длинные строки ввода (переноса), а также многострочные подсказки.

                  Promises API

                  Добавлено: v17.0.0
                  Stability: 1 — Экспериментальный

                  Class: readlinePromises.Interface

                  Добавлено: v17.0.0

                  • Extends:

                  Экземпляры класса readlinePromises.Interface создаются с использованием метода readlinePromises.createInterface() . Каждый экземпляр связан с одним потоком input Readable и одним потоком output Writable . Поток output используется для печати подсказок для пользовательского ввода, который поступает и считывается из потока input .

                  rl.question(query[, options])

                  Добавлено: v17.0.0

                  • query Оператор или запрос для записи в output , добавляемый в начало приглашения.
                  • options
                    • signal Опционально позволяет отменить question() с помощью AbortSignal .

                    Метод rl.question() отображает query , записывая его в output , ожидает ввода пользовательского ввода в input , затем вызывает функцию callback , передавая предоставленный ввод в качестве первого аргумента.

                    При вызове rl.question() возобновит поток input , если он был приостановлен.

                    Если readlinePromises.Interface был создан с output , установленным в null или undefined , query не записывается.

                    Если вопрос вызывается после rl.close() , он возвращает отклоненный promise.

                    const answer = await rl.question('What is your favorite food? '); console.log(`Oh, so your favorite food is $ `);

                    Использование AbortSignal для отмены вопроса.

                    const signal = AbortSignal.timeout(10_000); signal.addEventListener('abort', () => < console.log('The food question timed out'); >, < once: true >); const answer = await rl.question('What is your favorite food? ', < signal >); console.log(`Oh, so your favorite food is $ `);
                    Class: readlinePromises.Readline

                    Добавлено: v17.0.0

                    new readlinePromises.Readline(stream[, options])

                    Добавлено: v17.0.0

                    • stream Поток TTY .
                    • options
                      • autoCommit Если true , нет необходимости вызывать rl.commit() .
                      rl.clearLine(dir)

                      Добавлено: v17.0.0

                      Метод rl.clearLine() добавляет во внутренний список ожидающих действий действие, которое очищает текущую строку связанного stream в указанном направлении, указанном dir . Вызовите rl.commit() , чтобы увидеть эффект этого метода, если только autoCommit: true не был передан конструктору.

                      rl.clearScreenDown()

                      Добавлено: v17.0.0

                      • Returns: this

                      Метод rl.clearScreenDown() добавляет во внутренний список ожидающих действий действие, которое очищает связанный поток от текущей позиции курсора вниз. Вызовите rl.commit() , чтобы увидеть эффект этого метода, если только конструктору не был передан autoCommit: true .

                      rl.commit()

                      Добавлено: v17.0.0

                      • Returns:

                      Метод rl.commit() отправляет все ожидающие действия связанному stream и очищает внутренний список ожидающих действий.

                      rl.cursorTo(x[, y])

                      Добавлено: v17.0.0

                      Метод rl.cursorTo() добавляет во внутренний список ожидающих действий действие, которое перемещает курсор в указанную позицию в связанном stream . Вызовите rl.commit() , чтобы увидеть эффект этого метода, если только autoCommit: true не был передан конструктору.

                      rl.moveCursor(dx, dy)

                      Добавлено: v17.0.0

                      Метод rl.moveCursor() добавляет во внутренний список ожидающих действий действие, которое перемещает курсор относительно его текущей позиции в связанном stream . Вызовите rl.commit() , чтобы увидеть эффект этого метода, если только autoCommit: true не был передан конструктору.

                      rl.rollback()

                      Добавлено: v17.0.0

                      • Returns: this

                      Методы rl.rollback очищают внутренний список ожидающих действий, не отправляя его в связанный stream .

                      readlinePromises.createInterface(options)

                      Добавлено: v17.0.0

                      • options
                        • input Поток Readable для прослушивания. Эта опция является обязательной.
                        • output Поток Writable для записи данных readline.
                        • completer Дополнительная функция, используемая для автозаполнения Tab.
                        • terminal true , если потоки input и output должны обрабатываться как TTY, и в них записаны управляющие коды ANSI/VT100. По умолчанию: проверка isTTY в потоке output при создании экземпляра.
                        • history Начальный список строк истории. Эта опция имеет смысл только в том случае, если terminal установлен на true пользователем или внутренней проверкой output , в противном случае механизм кэширования истории вообще не инициализируется. По умолчанию: [] .
                        • historySize Максимальное количество сохраняемых строк истории. Чтобы отключить историю, установите это значение на 0 . Эта опция имеет смысл только в том случае, если terminal установлен на true пользователем или внутренней проверкой output , в противном случае механизм кэширования истории вообще не инициализируется. По умолчанию: 30 .
                        • removeHistoryDuplicates Если true , когда новая строка ввода, добавленная в список истории, дублирует старую, это удаляет старую строку из списка. По умолчанию: false .
                        • prompt Используемая строка приглашения. По умолчанию: ‘> ‘ .
                        • crlfDelay Если задержка между \r и \n превышает crlfDelay миллисекунды, \r и \n будут рассматриваться как отдельные входы конца строки. crlfDelay будет привязан к номеру less вместо 100 . Его можно установить на Infinity , и в этом случае \r , за которым следует \n , всегда будет считаться одной новой строкой (что может быть разумно для reading files со строкой \r\n . delimiter). По умолчанию: 100 .
                        • escapeCodeTimeout Длительность readlinePromises будет ожидать символа (при чтении неоднозначной последовательности клавиш в миллисекундах), который может как сформировать полную последовательность клавиш, используя уже прочитанные входные данные, так и может принять дополнительный ввод для завершения более длинного ключа. sequence). По умолчанию: 500 .
                        • tabSize Количество пробелов, равное вкладке (минимум 1). По умолчанию: 8 .

                        Метод readlinePromises.createInterface() создает новый экземпляр readlinePromises.Interface .

                        const readlinePromises = require('node:readline/promises'); const rl = readlinePromises.createInterface(< input: process.stdin, output: process.stdout >);

                        После создания экземпляра readlinePromises.Interface наиболее распространенным случаем является прослушивание события ‘line’ :

                        rl.on('line', (line) => < console.log(`Received: $ `); >);

                        Если для этого экземпляра terminal — true , то поток output получит наилучшую совместимость, если он определит свойство output.columns и выдаст событие ‘resize’ на output , если или когда столбцы когда-либо изменяются ( process.stdout делает это автоматически, если это TTY).).

                        Использование функции completer

                        Функция completer принимает текущую строку, введенную пользователем, в качестве аргумента и возвращает Array с двумя записями:

                        • Array с соответствующими записями для завершения.
                        • Подстрока, которая использовалась для сопоставления.
                        function completer(line) < const completions = '.help .error .exit .quit .q'.split(' '); const hits = completions.filter((c) => c.startsWith(line)); // Show all completions if none found return [hits.length ? hits : completions, line]; >

                        Функция completer также может возвращать

                        или быть асинхронной:

                        async function completer(linePartial) < await someAsyncWork(); return [['123'], linePartial]; >

                        Callback API

                        Добавлено: v0.1.104

                        Class: readline.Interface

                        Класс readline.Interface теперь наследуется от Interface .

                        • Extends:

                        Экземпляры класса readline.Interface создаются с использованием метода readline.createInterface() . Каждый экземпляр связан с одним потоком input Readable и одним потоком output Writable . Поток output используется для печати подсказок для пользовательского ввода, который поступает и считывается из потока input .

                        rl.question(query[, options], callback)

                        Добавлено: v0.3.3

                        • query Оператор или запрос для записи в output , добавляемый в начало приглашения.
                        • options
                          • signal Опционально позволяет отменить question() с помощью AbortController .

                          Метод rl.question() отображает query , записывая его в output , ожидает ввода пользовательского ввода в input , затем вызывает функцию callback , передавая предоставленный ввод в качестве первого аргумента.

                          При вызове rl.question() возобновит поток input , если он был приостановлен.

                          Если readline.Interface был создан с output , установленным в null или undefined , query не записывается.

                          Функция callback , передаваемая в rl.question() , не соответствует типичному шаблону принятия объекта Error или null в качестве первого аргумента. callback вызывается с предоставленным ответом в качестве единственного аргумента.

                          При вызове rl.question() после rl.close() будет выдана ошибка.

                          rl.question('What is your favorite food? ', (answer) => < console.log(`Oh, so your favorite food is $ `); >);

                          Использование AbortController для отмены вопроса.

                          const ac = new AbortController(); const signal = ac.signal; rl.question('What is your favorite food? ', < signal >, (answer) => < console.log(`Oh, so your favorite food is $ `); >); signal.addEventListener('abort', () => < console.log('The food question timed out'); >, < once: true >); setTimeout(() => ac.abort(), 10000);
                          readline.clearLine(stream, dir[, callback])

                          При передаче недопустимого обратного вызова аргументу callback теперь выдается ERR_INVALID_ARG_TYPE вместо ERR_INVALID_CALLBACK .

                          Обратный вызов write() потока и возвращаемое значение предоставляются.

                          • stream
                          • dir
                            • -1 : слева от курсора.
                            • 1 : справа от курсора.
                            • 0 : вся строка

                            Метод readline.clearLine() очищает текущую строку данного потока TTY в указанном направлении, указанном dir .

                            readline.clearScreenDown(stream[, callback])

                            При передаче недопустимого обратного вызова аргументу callback теперь выдается ERR_INVALID_ARG_TYPE вместо ERR_INVALID_CALLBACK .

                            Обратный вызов write() потока и возвращаемое значение предоставляются.

                            • stream
                            • callback Вызывается после завершения операции.
                            • Возвращает: false , если stream желает, чтобы вызывающий код ждал генерации события ‘drain’ , прежде чем продолжить запись дополнительных данных; в противном случае true .

                            Метод readline.clearScreenDown() очищает данный поток TTY от текущей позиции курсора вниз.

                            readline.createInterface(options)

                            Опция signal теперь поддерживается.

                            Опция history теперь поддерживается.

                            Опция tabSize теперь поддерживается.

                            Удалите максимальный предел опции crlfDelay .

                            Опция crlfDelay теперь поддерживается.

                            Опция prompt теперь поддерживается.

                            Опция historySize теперь может быть 0 .

                            • options
                              • input Поток Readable для прослушивания. Эта опция является обязательной.
                              • output Поток Writable для записи данных readline.
                              • completer Дополнительная функция, используемая для автозаполнения Tab.
                              • terminal true , если потоки input и output должны обрабатываться как TTY, и в них записаны управляющие коды ANSI/VT100. По умолчанию: проверка isTTY в потоке output при создании экземпляра.
                              • history Начальный список строк истории. Эта опция имеет смысл только в том случае, если terminal установлен на true пользователем или внутренней проверкой output , в противном случае механизм кэширования истории вообще не инициализируется. По умолчанию: [] .
                              • historySize Максимальное количество сохраняемых строк истории. Чтобы отключить историю, установите это значение на 0 . Эта опция имеет смысл только в том случае, если terminal установлен на true пользователем или внутренней проверкой output , в противном случае механизм кэширования истории вообще не инициализируется. По умолчанию: 30 .
                              • removeHistoryDuplicates Если true , когда новая строка ввода, добавленная в список истории, дублирует старую, это удаляет старую строку из списка. По умолчанию: false .
                              • prompt Используемая строка приглашения. По умолчанию: ‘> ‘ .
                              • crlfDelay Если задержка между \r и \n превышает crlfDelay миллисекунды, \r и \n будут рассматриваться как отдельные входы конца строки. crlfDelay будет привязан к номеру less вместо 100 . Его можно установить на Infinity , и в этом случае \r , за которым следует \n , всегда будет считаться одной новой строкой (что может быть разумно для reading files со строкой \r\n . delimiter). По умолчанию: 100 .
                              • escapeCodeTimeout Длительность readline будет ожидать символа (при чтении неоднозначной последовательности клавиш в миллисекундах), который может как сформировать полную последовательность клавиш, используя уже прочитанные входные данные, так и может принять дополнительный ввод для завершения более длинного ключа. sequence). По умолчанию: 500 .
                              • tabSize Количество пробелов, равное вкладке (минимум 1). По умолчанию: 8 .
                              • signal Позволяет закрывать интерфейс с помощью AbortSignal.. Прерывание подачи сигнала приведет к внутреннему вызову close на интерфейсе.

                              Метод readline.createInterface() создает новый экземпляр readline.Interface .

                              const readline = require('node:readline'); const rl = readline.createInterface(< input: process.stdin, output: process.stdout >);

                              После создания экземпляра readline.Interface наиболее распространенным случаем является прослушивание события ‘line’ :

                              rl.on('line', (line) => < console.log(`Received: $ `); >);

                              Если для этого экземпляра terminal — true , то поток output получит наилучшую совместимость, если он определит свойство output.columns и выдаст событие ‘resize’ на output , если или когда столбцы когда-либо изменяются ( process.stdout делает это автоматически, если это TTY).).

                              При создании readline.Interface с использованием stdin в качестве входных данных программа не завершится, пока не получит EOF character . Чтобы выйти, не дожидаясь ввода пользователя, позвоните process.stdin.unref() .

                              Использование функции completer

                              Функция completer принимает текущую строку, введенную пользователем, в качестве аргумента и возвращает Array с двумя записями:

                              • Array с соответствующими записями для завершения.
                              • Подстрока, которая использовалась для сопоставления.
                              function completer(line) < const completions = '.help .error .exit .quit .q'.split(' '); const hits = completions.filter((c) => c.startsWith(line)); // Показ всех завершений, если найден none return [hits.length ? hits : completions, line]; >

                              Функцию completer можно вызывать асинхронно, если она принимает два аргумента:

                              function completer(linePartial, callback) < callback(null, [['123'], linePartial]); >
                              readline.cursorTo(stream, x[, y][, callback])

                              При передаче недопустимого обратного вызова аргументу callback теперь выдается ERR_INVALID_ARG_TYPE вместо ERR_INVALID_CALLBACK .

                              Обратный вызов write() потока и возвращаемое значение предоставляются.

                              • stream
                              • x
                              • y
                              • callback Вызывается после завершения операции.
                              • Возвращает: false , если stream желает, чтобы вызывающий код ждал генерации события ‘drain’ , прежде чем продолжить запись дополнительных данных; в противном случае true .

                              Метод readline.cursorTo() перемещает курсор в указанную позицию в заданном TTY stream .

                              readline.moveCursor(stream, dx, dy[, callback])

                              При передаче недопустимого обратного вызова аргументу callback теперь выдается ERR_INVALID_ARG_TYPE вместо ERR_INVALID_CALLBACK .

                              Обратный вызов write() потока и возвращаемое значение предоставляются.

                              • stream
                              • dx
                              • dy
                              • callback Вызывается после завершения операции.
                              • Возвращает: false , если stream желает, чтобы вызывающий код ждал генерации события ‘drain’ , прежде чем продолжить запись дополнительных данных; в противном случае true .

                              Метод readline.moveCursor() перемещает курсор относительно его текущей позиции в заданном TTY stream .

                              readline.emitKeypressEvents(stream[, interface])

                              Добавлено: v0.7.7

                              • stream
                              • interface

                              Метод readline.emitKeypressEvents() заставляет данный поток Readable начинать генерировать события ‘keypress’ , соответствующие полученному вводу.

                              При необходимости interface указывает экземпляр readline.Interface , для которого автозаполнение отключается при обнаружении скопированного ввода.

                              Если stream является TTY , то он должен находиться в необработанном режиме.

                              Это автоматически вызывается любым экземпляром readline на его input , если input является терминалом. Закрытие экземпляра readline не мешает input генерировать события ‘keypress’ .

                              readline.emitKeypressEvents(process.stdin); if (process.stdin.isTTY) process.stdin.setRawMode(true);

                              Пример: Крошечный CLI

                              Следующий пример иллюстрирует использование класса readline.Interface для реализации небольшого интерфейса командной строки:

                              const readline = require('node:readline'); const rl = readline.createInterface(< input: process.stdin, output: process.stdout, prompt: 'OHAI> ' >); rl.prompt(); rl.on('line', (line) => < switch (line.trim()) < case 'hello': console.log('world!'); break; default: console.log(`Say what? I might have heard '$ '`); break; > rl.prompt(); >).on('close', () => < console.log('Have a great day!'); process.exit(0); >);

                              Пример: чтение файлового потока line-by-Line.

                              Обычным вариантом использования readline является построчное использование входного файла. Самый простой способ сделать это — использовать fs.ReadStream API, а также цикл for await. of :

                              const fs = require('node:fs'); const readline = require('node:readline'); async function processLineByLine( ) < const fileStream = fs.createReadStream('input.txt'); const rl = readline.createInterface(< input: fileStream, crlfDelay: Infinity >); // Примечание: мы используем опцию crlfDelay для распознавания всех экземпляров CR LF // ('\r\n') в input.txt как одиночный разрыв строки. for await (const line of rl) < // Каждая строка в input.txt будет последовательно доступна здесь как `line`. console.log(`Line from file: $ `); > > processLineByLine();

                              В качестве альтернативы можно использовать событие ‘line’ :

                              const fs = require('node:fs'); const readline = require('node:readline'); const rl = readline.createInterface(< input: fs.createReadStream('sample.txt'), crlfDelay: Infinity >); rl.on('line', (line) => < console.log(`Line from file: $ `); >);

                              В настоящее время цикл for await. of может работать немного медленнее. Если важны расход и скорость async / await , можно применить смешанный подход:

                              const < once >= require('node:events'); const < createReadStream >= require('node:fs'); const < createInterface >= require('node:readline'); (async function processLineByLine( ) < try < const rl = createInterface(< input: createReadStream('big-file.txt'), crlfDelay: Infinity >); rl.on('line', (line) => < // Обрабатываем строку. >); await once(rl, 'close'); console.log('File processed.'); > catch (err) < console.error(err); > >)();

                              TTY keybindings

                              Keybindings Description Notes
                              Ctrl + Shift + Backspace Удалить строку слева Не работает на Linux, Mac и Windows
                              Ctrl + Shift + Delete Удалить строку справа Не работает на Mac
                              Ctrl + C Выпустите SIGINT или закройте экземпляр readline.
                              Ctrl + H Delete left
                              Ctrl + D Удалить вправо или закрыть экземпляр readline, если текущая строка пуста / EOF Не работает в Windows
                              Ctrl + U Удалить от текущей позиции до начала строки
                              Ctrl + K Удалить от текущей позиции до конца строки
                              Ctrl + Y Скопируйте (Recall) ранее удаленный текст. Работает только с текстом, удаленным Ctrl + U or Ctrl + K
                              Meta + Y Циклическое переключение между ранее удаленными строками Доступно только при последнем нажатии клавиши. Ctrl + Y
                              Ctrl + A Go до начала строки
                              Ctrl + E Go до конца строки
                              Ctrl + B Назад на один символ
                              Ctrl + F Вперед на один символ
                              Ctrl + L Clear screen
                              Ctrl + N Следующий элемент истории
                              Ctrl + P Предыдущий элемент истории
                              Ctrl + — Отменить предыдущее изменение Любое нажатие клавиши, вызывающее код клавиши 0x1F , будет выполнять это действие. Во многих терминалах, например xterm , это связано с Ctrl + — .
                              Ctrl + 6 Повторить предыдущее изменение Многие терминалы не имеют функции повтора нажатия клавиши по умолчанию. Выбираем код ключа 0x1E для выполнения повтора. В xterm это связано с Ctrl + 6 by default.
                              Ctrl + Z Перемещает запущенный процесс в фоновый режим. Введите fg и нажмите Enter to return. Не работает в Windows
                              Ctrl + W or Ctrl + Backspace Удалить назад до границы слова Ctrl + Backspace Не работает на Linux, Mac и Windows
                              Ctrl + Delete Удалить вперед до границы слова Не работает на Mac
                              Ctrl + Left arrow or Meta + B Word left Ctrl + Left arrow Не работает на Mac
                              Ctrl + Right arrow or Meta + F Word right Ctrl + Right arrow Не работает на Mac
                              Meta + D or Meta + Delete Удалить слово вправо Meta + Delete Не работает на окнах
                              Meta + Backspace Удалить слово слева Не работает на Mac

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *