Я думал сделать простой сервер http-сервер с некоторым расширением консоли. Я нашел фрагмент для чтения из данных командной строки.
var i = rl.createInterface(process.stdin, process.stdout, null);
i.question('Write your name: ', function(answer) {
console.log('Nice to meet you> ' + answer);
i.close();
process.stdin.destroy();
});
хорошо задавать вопросы повторно, я не могу просто использовать while(done) { }
цикл? Также хорошо, если сервер получает выходные данные во время вопроса, это разрушает линию.
rl
вы имеете в виду readline ?while(done)
цикл.Ответы:
Вы не можете выполнить цикл while (done), потому что для этого потребуется блокировка ввода, что не нравится в node.js.
Вместо этого установите обратный вызов, который будет вызываться каждый раз, когда что-то вводится:
источник
Я использовал другой API для этой цели ..
Это позволяет запрашивать в цикле, пока ответ не будет
right
. Также это дает хорошую маленькую консоль. Вы можете найти подробности @ http://nodejs.org/api/readline.html#readline_example_tiny_cliисточник
API Readline немного изменился с 12 '. Документ показывает полезный пример для захвата пользовательского ввода из стандартного потока:
Больше информации здесь.
источник
Я считаю, что это заслуживает современного
async-await
ответа, предполагая, что используется узел> = 7.x.Ответ все еще использует,
ReadLine::question
но оборачивает его так, чтобыwhile (done) {}
это было возможно, о чем ОП явно спрашивает.а затем пример использования
приводит к следующему разговору
источник
Пожалуйста, используйте readline-sync , это позволяет вам работать с синхронной консолью без аддов обратного вызова. Даже работает с паролями:
источник
Ответ @rob будет работать в большинстве случаев, но он может работать не так, как вы ожидаете при длинных входах.
Вот что вы должны использовать вместо этого:
Объяснение того, почему это решение работает:
addListener('data')
работает как буфер, обратный вызов будет вызываться, когда он заполнен или / и это конец ввода.Как насчет длинных входов? Одного
'data'
обратного вызова не будет достаточно, потому что вы получите ваш вход разделить на две или более частей. Это часто не удобно.addListener('end')
уведомит нас, когда читатель стандартного ввода закончит чтение нашего ввода. Поскольку мы хранили предыдущие данные, теперь мы можем читать и обрабатывать все это вместе.источник
Я рекомендую использовать Inquirer , поскольку он предоставляет набор общих интерактивных пользовательских интерфейсов командной строки.
источник
Вот пример:
Вывод:
источник
Это слишком сложно. Более простая версия:
будет использовать
тогда он будет ждать, когда вы используете
тогда легче повторить. например:
источник
Вероятно, в общем случае приложение будет отображать универсальное приглашение и обрабатывать его в операторе switch.
Вы можете получить поведение, эквивалентное циклу while, используя вспомогательную функцию, которая будет вызывать себя в обратном вызове:
Вы можете передать пустую строку вместо того,
'app> '
если ваше приложение уже печатает что-то на экране за пределами этого цикла.источник
Мой подход к этому будет использовать асинхронные генераторы .
Если у вас есть множество вопросов:
Чтобы использовать
await
ключевое слово, вы должны обернуть вашу программу в асинхронный IIFE.Ожидаемые результаты:
Если вы хотите получить вопросы и ответы в целом, вы можете добиться этого с помощью простой модификации:
источник
Я должен был написать игру «крестики-нолики» в Node, которая принимала данные из командной строки, и написал этот базовый блок кода async / await, который добился цели.
источник
Блокировка чтения строки разблокированного поведения
Представьте, что у вас есть три вопроса для ответа из консоли, поскольку теперь вы знаете, что этот код не будет работать, потому что стандартный модуль readline имеет «разблокированное» поведение, в котором каждый rl.question является независимым потоком, поэтому этот код не будет выполняться.
Запуск выхода:
Предложенное решение использует источник событий для оповещения об окончании разблокирующего потока и включает в себя функцию логики цикла и окончания программы в своей функции прослушивателя.
Запуск выхода:
источник
Я создал небольшой скрипт для чтения каталога и записал имя консоли, новый файл (пример: «name.txt») и текст в файл.
источник
Самый простой способ - использовать readline-sync
Он обрабатывает один за другим вход и выход.
например:
источник
require
заявление. Там нет причин, чтобы оставить это.