tutorial socket node example español descubriendo node.js console

node.js - node - socket io tutorial



Leer el valor de la consola, interactivamente (7)

Pensé en hacer un servidor http servidor 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 ciclo while(done) { } ? También, si el servidor recibe el resultado en el momento de la pregunta, arruina la línea.


Creo que esto merece una respuesta async-await moderna, suponiendo que se usa el nodo> = 7.x.

La respuesta todavía usa ReadLine::question pero la envuelve para que while (done) {} sea ​​posible, que es algo sobre lo que el OP pregunta explícitamente.

var cl = readln.createInterface( process.stdin, process.stdout ); var question = function(q) { return new Promise( (res, rej) => { cl.question( q, answer => { res(answer); }) }); };

y luego un uso de ejemplo

(async function main() { var answer; while ( answer != ''yes'' ) { answer = await question(''Are you sure? ''); } console.log( ''finally you are sure!''); })();

conduce a la siguiente conversación

Are you sure? no Are you sure? no Are you sure? yes finally you are sure!


He usado otra API para este propósito ...

var readline = require(''readline''); var rl = readline.createInterface(process.stdin, process.stdout); rl.setPrompt(''guess> ''); rl.prompt(); rl.on(''line'', function(line) { if (line === "right") rl.close(); rl.prompt(); }).on(''close'',function(){ process.exit(0); });

Esto permite indicar el ciclo hasta que la respuesta sea right . También ofrece una consola pequeña y agradable. Puede encontrar los detalles @ http://nodejs.org/api/readline.html#readline_example_tiny_cli


La API de Readline ha cambiado bastante desde los 12 ''. Los documentos muestran un ejemplo útil para capturar la entrada del usuario de una transmisión estándar:

const readline = require(''readline''); const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); rl.question(''What do you think of Node.js? '', (answer) => { console.log(''Thank you for your valuable feedback:'', answer); rl.close(); });

Más información aquí.


La respuesta @rob funcionará la mayoría de las veces, pero puede no funcionar como espera con entradas largas.

Eso es lo que deberías estar usando en su lugar:

const stdin = process.openStdin(); let content = ''''; stdin.addListener(''data'', d => { content += d.toString(); }); stdin.addListener(''end'', () => { console.info(`Input: ${content}`); });

Explicación sobre por qué funciona esta solución:

addListener(''data'') funciona como un búfer, se llamará a la devolución de llamada cuando esté llena y / o sea el final de la entrada.

¿Qué hay de las entradas largas? Una devolución ''data'' llamada de ''data'' no será suficiente, por lo tanto, obtendrá su división de entrada en dos o más partes. Eso a menudo no es conveniente.

addListener(''end'') nos notificará cuando el lector stdin haya terminado de leer nuestra entrada. Dado que hemos estado almacenando los datos anteriores, ahora podemos leerlos y procesarlos todos juntos.


Un caso de uso común probablemente sea 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:

const readline = require(''readline''); const rl = readline.createInterface(process.stdin, process.stdout); function promptInput (prompt, handler) { rl.question(prompt, input => { if (handler(input) !== false) { promptInput(prompt, handler); } else { rl.close(); } }); } promptInput(''app> '', input => { switch (input) { case ''my command'': // handle this command break; case ''exit'': console.log(''Bye!''); return false; } });

Puede pasar una cadena vacía en lugar de ''app> '' si su aplicación ya imprime algo en la pantalla fuera de este ciclo.


Utilice readline-sync , esto le permite trabajar con la consola sincrónica sin resúmenes de devolución de llamada. Incluso funciona con contraseñas:

var favFood = read.question(''What is your favorite food? '', { hideEchoBack: true // The typed text on screen is hidden by `*` (default). });


no se puede hacer un ciclo "while (done)" porque eso requeriría un bloqueo en la entrada, algo que node.js no desea hacer.

En su lugar, configure una devolución de llamada para que se llame cada vez que se ingresa algo:

var stdin = process.openStdin(); stdin.addListener("data", function(d) { // note: d is an object, and when converted to a string it will // end with a linefeed. so we (rather crudely) account for that // with toString() and then trim() console.log("you entered: [" + d.toString().trim() + "]"); });