Pomyślałem o stworzeniu prostego serwera HTTP z rozszerzeniem konsoli. Znalazłem fragment do odczytania z danych wiersza poleceń.
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();
});
dobrze zadawać pytania wielokrotnie, nie mogę po prostu użyć while(done) { }
pętli? Również dobrze, jeśli serwer otrzyma dane wyjściowe w czasie pytania, zrujnuje linię.
rl
masz na myśli readline ?while(done)
pętlę.Odpowiedzi:
nie możesz zrobić pętli "while (done)", ponieważ wymagałoby to blokowania wejścia, czego node.js nie lubi.
Zamiast tego skonfiguruj wywołanie zwrotne, które będzie wywoływane za każdym razem, gdy coś zostanie wprowadzone:
źródło
W tym celu użyłem innego API.
Pozwala to na podpowiadanie w pętli, aż odpowiedź będzie
right
. Daje też fajną małą konsolę. Szczegóły można znaleźć @ http://nodejs.org/api/readline.html#readline_example_tiny_cliźródło
Readline API zmieniło się nieco od 12 roku. Dokumenty pokazują przydatny przykład przechwytywania danych wejściowych użytkownika ze standardowego strumienia:
Więcej informacji tutaj.
źródło
Uważam, że zasługuje to na nowoczesną
async-await
odpowiedź, zakładając, że używany jest węzeł> = 7.x.Odpowiedź nadal używa,
ReadLine::question
ale zawija ją tak, żewhile (done) {}
jest możliwe, o co PO wyraźnie pyta.a następnie przykład użycia
prowadzi do następującej rozmowy
źródło
Użyj readline-sync , pozwala to pracować z konsolą synchroniczną bez piekieł wywołań zwrotnych. Działa nawet z hasłami:
źródło
@rob answer będzie działać przez większość czasu, ale może nie działać zgodnie z oczekiwaniami w przypadku długich danych wejściowych.
Oto, czego powinieneś używać zamiast tego:
Wyjaśnienie, dlaczego to rozwiązanie działa:
addListener('data')
działa jak bufor, wywołanie zwrotne zostanie wywołane, gdy będzie pełny lub / i nastąpi koniec wejścia.A co z długimi wejściami? Pojedyncze
'data'
wywołanie zwrotne nie wystarczy, dlatego dane wejściowe zostaną podzielone na dwie lub więcej części. To często nie jest wygodne.addListener('end')
powiadomi nas, gdy czytnik stdin skończy odczytywać nasze dane wejściowe. Ponieważ zapisywaliśmy poprzednie dane, możemy je teraz odczytywać i przetwarzać razem.źródło
Polecam korzystanie z Inquirer , ponieważ zawiera zbiór typowych interaktywnych interfejsów użytkownika wiersza poleceń.
źródło
Oto przykład:
Wynik:
źródło
To jest zbyt skomplikowane. Łatwiejsza wersja:
byłoby użyć
wtedy będzie czekać, kiedy użyjesz
wtedy łatwiej jest powtórzyć. na przykład:
źródło
Typowym przypadkiem użycia byłoby prawdopodobnie wyświetlenie przez aplikację ogólnego monitu i obsłużenie go w instrukcji switch.
Możesz uzyskać zachowanie równoważne pętli while, używając funkcji pomocniczej, która wywoła się w wywołaniu zwrotnym:
Możesz przekazać pusty ciąg zamiast,
'app> '
jeśli Twoja aplikacja już drukuje coś na ekranie poza tą pętlą.źródło
Moje podejście do tego polegałoby na użyciu generatorów asynchronicznych .
Zakładając, że masz szereg pytań:
Aby użyć
await
słowa kluczowego, musisz opakować swój program w asynchroniczne IIFE.Oczekiwane rezultaty:
Jeśli chcesz uzyskać wszystkie pytania i odpowiedzi, możesz to osiągnąć za pomocą prostej modyfikacji:
źródło
Musiałem napisać grę „kółko i krzyżyk” w Node, która pobierała dane wejściowe z wiersza poleceń i napisała podstawowy blok kodu async / await, który załatwił sprawę.
źródło
Blokowanie niezablokowanego zachowania readline
Wyobraź sobie, że masz trzy pytania, na które musisz odpowiedzieć z konsoli, ponieważ teraz wiesz, że ten kod nie zostanie uruchomiony, ponieważ standardowy moduł readline ma zachowanie 'odblokowane', co oznacza, że każde pytanie rl.question jest niezależnym wątkiem, więc ten kod nie będzie działać.
Wydajność robocza:
Proponowane rozwiązanie wykorzystuje emiter zdarzeń do sygnalizowania końca odblokowującego wątku oraz włącza logikę pętli i koniec programu do jego funkcji nasłuchującej.
Wydajność robocza:
źródło
Pozyskałem mały skrypt do odczytu katalogu i zapisania nazwy konsoli nowego pliku (przykład: „nazwa.txt”) i tekstu do pliku.
źródło
Najłatwiejszym sposobem jest użycie readline-sync
Przetwarza jedno po drugim wejście i wyjście.
na przykład:
źródło
require
oświadczenie. Nie ma powodu, aby to pomijać.