Редактирование файла через командную строку в node js

Пишу небольшую программу, которая позволяет юзеру через кмд редачить файлы, и надо сделать так, чтобы пользователь мог вписывать в файл текст построчно (написал строку, нажал enter, строка добавилась в файл, юзер снова пишет строку, и так пока он не напишет что-то вроде stop).
Получилось что-то вроде такого:

rl.question('Запишите строчку в файл', (answer) => {
  fs.appendFileSync(fileName,answer);
  rl.close();
  console.log(fs.readFileSync(fileName,"utf-8")); //Вывод содержимого файла после заполнения строки
});

Теперь нужно сделать цикл, в котором снова и снова будет вызываться rl.question(), но сделать это так, чтобы следующая итерация цикла начиналась только после получения ответа от пользователя.
Пробовал await в сочетании с while, не помогло - запускается бесконечный цикл с выведением в командную строку "Запишите строчку в файл" (бесконечный потому что юзер чисто физически не может вписать что-либо) Буду очень признателен, если кто-то подскажет, как можно получить данные о том, получен ли ответ от пользователя, и как, если ответ отрицательный, запретить следующую итерацию цикла.


Ответы (2 шт):

Автор решения: Oliver Patterson

Сделайте свою функцию, которая будет асинхронная.

import * as readline from 'node:readline/promises';
import { stdin as input, stdout as output } from 'node:process';

const rl = readline.createInterface({ input, output });
const fileName = 'test.txt';

(async function ()
{
    while (true)
    {
        const answer = await rl.question('Запишите строчку в файл');

        if (answer === 'stop')
        {
            rl.close();
            break;
        }

        // Если уловную команду "стоп" нужно писать в файл, код ниже перенести выше if
        fs.appendFileSync(fileName, answer);
    }
})();

→ Ссылка
Автор решения: Daniil Loban

Основываясь на примере из документации Tiny CLI можно написать событийный функционал без циклов и рекурсии, однако оно будет работать как рекурсия просто предлагая каждый раз ввод, до тех пор пока мы принудительно не закроем интерфейс ввода.

Плюсом данного метода так же является то что использовании стандартных клавиш прерывания ввода в консоли таких как CTL + C событие close так же отработает.

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

const rl = readline.createInterface(process.stdin, process.stdout);
rl.setPrompt('Запишите строчку в файл>');

const fileName = 'output.txt';

rl.prompt(); // запускаем процесс ввода

rl.on('line', function(answer) {
    if (answer.trim() === 'stop') rl.close() // прерываем
    fs.appendFileSync(fileName, answer); // пишем в файл
    rl.prompt(); // продолжаем процесс ввода
}).on('close', function() {
    console.log('файл записан'); // тут можно чистить ресурсы если нужно
    process.exit(0); // завершаем работу скрипта если нужно
});

Пример работы, слева файл, справа консоль:

пример работы

→ Ссылка