Pensé hacer un servidor http simple con alguna extensión de consola. Encontré el fragmento para leer de los datos de la línea de comandos.
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();
});
bueno para hacer las preguntas repetidamente, simplemente no puedo usar el while(done) { }
bucle? También bien si el servidor recibe salida en el momento de la pregunta, arruina la línea.
rl
te refieres a readline ?while(done)
bucle.Respuestas:
no puede hacer un ciclo "while (done)" porque eso requeriría bloqueo en la entrada, algo que a node.js no le gusta hacer.
En su lugar, configure una devolución de llamada para que se llame cada vez que ingrese algo:
fuente
He usado otra API para este propósito ...
Esto permite solicitar en bucle hasta que la respuesta sea
right
. También ofrece una pequeña consola agradable. Puede encontrar los detalles en http://nodejs.org/api/readline.html#readline_example_tiny_clifuente
La API de Readline ha cambiado bastante desde 12 '. Los documentos muestran un ejemplo útil para capturar la entrada del usuario de una secuencia estándar:
Más información aquí.
fuente
Creo que esto merece una
async-await
respuesta moderna , suponiendo que se use el nodo> = 7.x.La respuesta todavía la usa,
ReadLine::question
pero la envuelve para quewhile (done) {}
sea posible, que es algo que el OP pregunta explícitamente.y luego un ejemplo de uso
conduce a la siguiente conversación
fuente
Utilice readline-sync , esto le permite trabajar con una consola síncrona sin infusiones de devoluciones de llamada. Incluso funciona con contraseñas:
fuente
La respuesta @rob funcionará la mayoría de las veces, pero podría no funcionar como se espera con entradas largas.
Eso es lo que deberías usar en su lugar:
Explicación sobre por qué funciona esta solución:
addListener('data')
funciona como un búfer, se devolverá la llamada cuando esté lleno o / y sea el final de la entrada.¿Qué pasa con las entradas largas? Una sola
'data'
devolución de llamada no será suficiente, por lo tanto, obtendrá su entrada dividida en dos o más partes. Eso a menudo no es conveniente.addListener('end')
nos notificará cuando el lector de stdin termine de leer nuestra entrada. Como hemos estado almacenando los datos anteriores, ahora podemos leerlos y procesarlos todos juntos.fuente
Recomiendo usar Inquirer , ya que proporciona una colección de interfaces de usuario de línea de comandos interactivas comunes.
fuente
Aquí hay un ejemplo:
Salida:
fuente
Esto es demasiado complicado. Una versión más fácil de:
sería usar
entonces esperará cuando uses
entonces es más fácil repetir. por ejemplo:
fuente
Un caso de uso común probablemente sería que la aplicación muestre un mensaje genérico y lo maneje en una declaración de cambio.
Podría obtener un comportamiento equivalente a un ciclo while utilizando una función auxiliar que se llamaría a sí misma en la devolución de llamada:
Puede pasar una cadena vacía en lugar de
'app> '
si su aplicación ya imprime algo en la pantalla fuera de este bucle.fuente
Mi enfoque para esto sería usar generadores asíncronos .
Suponiendo que tiene una serie de preguntas:
Para utilizar la
await
palabra clave, debe envolver su programa en un IIFE asíncrono.Resultados previstos:
Si desea obtener preguntas y respuestas por completo, puede lograr esto con una simple modificación:
fuente
Tuve que escribir un juego de "tic-tac-toe" en Node que tomaba datos de la línea de comando y escribía este bloque básico de código asíncrono / espera que hizo el truco.
fuente
Bloqueo de comportamiento de desbloqueo de línea de lectura
Imagine que tiene tres preguntas que responder desde la consola, ya que ahora sabe que este código no se ejecutará porque el módulo estándar readline tiene un comportamiento 'desbloqueado' que dice que cada pregunta rl es un hilo independiente, por lo que este código no se ejecutará.
Ejecución de salida:
La solución propuesta utiliza un emisor de eventos para señalar el final de un hilo de desbloqueo e incluye la lógica del bucle y el final del programa en su función de escucha.
Ejecución de salida:
fuente
He creado un pequeño script para leer el directorio y escribir un nuevo archivo de nombre de consola (ejemplo: 'nombre.txt') y texto en el archivo.
fuente
La forma más fácil es usar readline-sync
Procesa una por una entrada y sale.
p.ej:
fuente
require
declaración. No hay razón para dejarlo fuera.