J'ai pensé créer un serveur http simple avec une extension de console. J'ai trouvé l'extrait à lire à partir des données de ligne de commande.
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();
});
Eh bien, pour poser les questions à plusieurs reprises, je ne peux pas simplement utiliser le while(done) { }
boucle? Aussi bien si le serveur reçoit la sortie au moment des questions, cela ruine la ligne.
rl
vous voulez dire readline ?while(done)
boucle.Réponses:
vous ne pouvez pas faire une boucle "while (done)" car cela nécessiterait un blocage en entrée, ce que node.js n'aime pas faire.
Au lieu de cela, configurez un rappel à appeler chaque fois que quelque chose est entré:
la source
J'ai utilisé une autre API à cette fin.
Cela permet d'inviter en boucle jusqu'à ce que la réponse soit
right
. En outre, cela donne une jolie petite console.Vous pouvez trouver les détails @ http://nodejs.org/api/readline.html#readline_example_tiny_clila source
L'API Readline a beaucoup changé depuis 12 '. Les documents montrent un exemple utile pour capturer les entrées utilisateur à partir d'un flux standard:
Plus d'informations ici.
la source
Je pense que cela mérite une
async-await
réponse moderne , en supposant que le nœud> = 7.x est utilisé.La réponse l'utilise toujours
ReadLine::question
mais l'enveloppe pour que lewhile (done) {}
soit possible, ce que l'OP demande explicitement.puis un exemple d'utilisation
mène à la conversation suivante
la source
Veuillez utiliser readline-sync , cela vous permet de travailler avec une console synchrone sans enfer de callbacks. Fonctionne même avec des mots de passe:
la source
@rob answer fonctionnera la plupart du temps, mais il se peut que cela ne fonctionne pas comme prévu avec de longues entrées.
C'est ce que vous devriez utiliser à la place:
Explication des raisons pour lesquelles cette solution fonctionne:
addListener('data')
fonctionne comme un tampon, le callback sera appelé quand il est plein ou / et sa fin d'entrée.Qu'en est-il des entrées longues? Un seul
'data'
rappel ne suffira pas, vous obtiendrez donc votre entrée divisée en deux ou plusieurs parties. Ce n'est souvent pas pratique.addListener('end')
nous avertira lorsque le lecteur stdin aura fini de lire notre entrée. Depuis que nous stockons les données précédentes, nous pouvons maintenant les lire et les traiter toutes ensemble.la source
Je recommande d'utiliser Inquirer , car il fournit une collection d'interfaces utilisateur de ligne de commande interactives communes.
la source
Voici un exemple:
Production:
la source
C'est trop compliqué. Une version plus simple de:
serait utiliser
alors il attendra quand vous utiliserez
alors il est plus facile de répéter. par exemple:
la source
Un cas d'utilisation courant serait probablement que l'application affiche une invite générique et la gère dans une instruction switch.
Vous pouvez obtenir un comportement équivalent à une boucle while en utilisant une fonction d'assistance qui s'appellerait elle-même dans le rappel:
Vous pouvez passer une chaîne vide au lieu de
'app> '
si votre application imprime déjà quelque chose à l'écran en dehors de cette boucle.la source
Mon approche serait d'utiliser des générateurs asynchrones .
En supposant que vous ayez un éventail de questions:
Pour utiliser le
await
mot - clé, vous devez envelopper votre programme dans un IIFE asynchrone.Résultats attendus:
Si vous souhaitez obtenir des questions et des réponses, vous pouvez y parvenir avec une simple modification:
la source
J'ai dû écrire un jeu "tic-tac-toe" dans Node qui prenait les entrées de la ligne de commande, et j'ai écrit ce bloc de code de base async / await qui a fait l'affaire.
la source
Blocage du comportement débloqué de readline
Imaginez que vous ayez trois questions auxquelles il faut répondre depuis la console, car vous savez maintenant que ce code ne fonctionnera pas car le module standard de readline a un comportement `` débloqué '', disons que chaque rl.question est un thread indépendant, donc ce code ne fonctionnera pas.
Sortie en cours d'exécution:
La solution proposée utilise un émetteur d'événements pour signaler la fin d'un thread de déblocage, et inclut la logique de boucle et la fin du programme dans sa fonction d'écoute.
Sortie en cours d'exécution:
la source
J'ai créé un petit script pour lire le répertoire et écrire un nouveau fichier de nom de console (exemple: 'name.txt') et du texte dans un fichier.
la source
Le moyen le plus simple est d'utiliser readline-sync
Il traite une par une entrée et sortie.
par exemple:
la source
require
déclaration. Il n'y a aucune raison de le laisser de côté.