Ich dachte, einen einfachen Server-HTTP-Server mit einer Konsolenerweiterung zu erstellen. Ich habe das Snippet gefunden, das aus Befehlszeilendaten gelesen werden kann.
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();
});
Nun, um die Fragen wiederholt zu stellen, kann ich nicht einfach die while(done) { }
Schleife verwenden? Auch gut, wenn der Server zur Fragestunde Ausgabe empfängt, ruiniert er die Leitung.
rl
du meinst readline ?while(done)
Schleife erstellen .Antworten:
Sie können keine "while (done)" - Schleife ausführen, da dies eine Blockierung der Eingabe erfordern würde, was node.js nicht gerne tut.
Richten Sie stattdessen einen Rückruf ein, der bei jeder Eingabe aufgerufen wird:
quelle
Ich habe eine andere API für diesen Zweck verwendet.
Dies ermöglicht es, in einer Schleife aufzufordern, bis die Antwort lautet
right
. Es gibt auch eine nette kleine Konsole. Sie finden die Details unter http://nodejs.org/api/readline.html#readline_example_tiny_cliquelle
Die Readline-API hat sich seit 12 'ziemlich verändert. Die Dokumente zeigen ein nützliches Beispiel zum Erfassen von Benutzereingaben aus einem Standard-Stream:
Weitere Informationen hier.
quelle
Ich glaube, dies verdient eine moderne
async-await
Antwort, vorausgesetzt, es wird der Knoten> = 7.x verwendet.Die Antwort verwendet
ReadLine::question
sie immer noch , umschließt sie jedoch so, dass dieswhile (done) {}
möglich ist, worüber das OP explizit fragt.und dann eine beispielhafte Verwendung
führt zu folgendem Gespräch
quelle
Bitte verwenden Sie readline-sync , damit Sie mit der synchronen Konsole ohne Rückruf-Hells arbeiten können. Funktioniert sogar mit Passwörtern:
quelle
Die Antwort von @rob funktioniert meistens, funktioniert jedoch möglicherweise nicht wie erwartet bei langen Eingaben.
Das sollten Sie stattdessen verwenden:
Erklärung, warum diese Lösung funktioniert:
addListener('data')
funktioniert wie ein Puffer, Rückruf wird aufgerufen, wenn er voll ist oder / und das Ende der Eingabe ist.Was ist mit langen Eingaben? Ein einzelnes
'data'
Rückruf reicht nicht aus, daher wird Ihre Eingabe in zwei oder mehr Teile aufgeteilt. Das ist oft nicht bequem.addListener('end')
wird uns benachrichtigen, wenn der Standardleser mit dem Lesen unserer Eingaben fertig ist. Da wir die vorherigen Daten gespeichert haben, können wir sie jetzt alle zusammen lesen und verarbeiten.quelle
Ich empfehle die Verwendung von Inquirer , da es eine Sammlung gängiger interaktiver Befehlszeilenbenutzeroberflächen bietet.
quelle
Hier ist ein Beispiel:
Ausgabe:
quelle
Dies ist zu kompliziert. Eine einfachere Version von:
wäre zu verwenden
dann wird es warten, wenn Sie verwenden
dann ist es einfacher zu wiederholen. beispielsweise:
quelle
Ein häufiger Anwendungsfall wäre wahrscheinlich, dass die App eine generische Eingabeaufforderung anzeigt und diese in einer switch-Anweisung behandelt.
Sie könnten ein Verhalten erhalten, das einer while-Schleife entspricht, indem Sie eine Hilfsfunktion verwenden, die sich im Rückruf selbst aufruft:
Sie können eine leere Zeichenfolge übergeben, anstatt
'app> '
dass Ihre App bereits etwas außerhalb dieser Schleife auf den Bildschirm druckt.quelle
Mein Ansatz hierfür wäre die Verwendung von asynchronen Generatoren .
Angenommen, Sie haben eine Reihe von Fragen:
Um das
await
Schlüsselwort verwenden zu können, müssen Sie Ihr Programm in ein asynchrones IIFE einbinden.Erwartete Ergebnisse:
Wenn Sie Fragen und Antworten erhalten möchten, können Sie dies mit einer einfachen Änderung erreichen:
quelle
Ich musste ein "Tic-Tac-Toe" -Spiel in Node schreiben, das Eingaben über die Befehlszeile entgegennahm, und diesen grundlegenden asynchronen / abwartenden Codeblock schreiben, der den Trick ausführte.
quelle
Blockieren des nicht blockierten Readline-Verhaltens
Stellen Sie sich vor, Sie müssen drei Fragen von der Konsole aus beantworten, da Sie jetzt wissen, dass dieser Code nicht ausgeführt wird, da das Readline-Standardmodul das Verhalten "nicht blockiert" aufweist. Angenommen, jede rl.question ist ein unabhängiger Thread, sodass dieser Code nicht ausgeführt wird.
Laufende Ausgabe:
Die vorgeschlagene Lösung verwendet einen Ereignisemitter, um das Ende eines nicht blockierenden Threads zu signalisieren, und bezieht die Schleifenlogik und das Programmende in ihre Listener-Funktion ein.
Laufende Ausgabe:
quelle
Ich habe ein kleines Skript für das Leseverzeichnis erstellt und eine neue Datei mit Konsolennamen (Beispiel: 'name.txt') und Text in eine Datei geschrieben.
quelle
Am einfachsten ist es, Readline-Sync zu verwenden
Es verarbeitet eine Eingabe und Ausgabe nach der anderen.
z.B:
quelle
require
Aussage hinzufügen. Es gibt keinen Grund, es wegzulassen.