Saltar al contenido principal

Entrada de datos por consola

Node.js proporciona el módulo nativo readline que nos permite leer datos línea por línea desde un flujo de entrada (como la consola). Este módulo es la forma estándar y recomendada para capturar la entrada del usuario.

Configuración básica

Para usar readline, primero debemos importarlo y crear una interfaz que conecte la entrada estándar (stdin) con la salida estándar (stdout):

const readline = require('readline');

const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});

Solicitar datos al usuario

Una vez creada la interfaz, utilizamos el método question() para mostrar un mensaje al usuario y capturar su respuesta:

rl.question('¿Cómo te llamas? ', (respuesta) => {
console.log(`Hola, ${respuesta}!`);
rl.close();
});
Importante

Siempre debemos cerrar la interfaz con rl.close() cuando terminemos de usarla, o el programa quedará esperando más entrada.

Ejemplos

const readline = require('readline');

const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});

rl.question('¿Cuál es tu nombre? ', (nombre) => {
rl.question('¿Cuántos años tienes? ', (edad) => {
console.log(`Hola ${nombre}, tienes ${edad} años.`);
rl.close();
});
});
const readline = require('readline');

const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});

rl.question('Introduce el primer número: ', (num1) => {
rl.question('Introduce el segundo número: ', (num2) => {
const resultado = parseFloat(num1) + parseFloat(num2);
console.log(`La suma es: ${resultado}`);
rl.close();
});
});
Nota

Los datos recibidos son siempre cadenas de texto (strings). Si necesitamos trabajar con números, debemos convertirlos usando parseInt() o parseFloat().

const readline = require('readline');

const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});

function mostrarMenu() {
console.log('\n--- MENÚ ---');
console.log('1. Saludar');
console.log('2. Despedirse');
console.log('3. Salir');

rl.question('Elige una opción: ', (opcion) => {
switch(opcion) {
case '1':
console.log('¡Hola! Bienvenido');
mostrarMenu();
break;
case '2':
console.log('¡Hasta pronto!');
mostrarMenu();
break;
case '3':
console.log('Cerrando programa...');
rl.close();
break;
default:
console.log('Opción no válida');
mostrarMenu();
}
});
}

mostrarMenu();

Usando Promises para código más limpio

El anidamiento de múltiples preguntas puede hacer el código difícil de leer. Podemos crear una función auxiliar que devuelva una Promise:

const readline = require('readline');

const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});

function pregunta(texto) {
return new Promise((resolve) => {
rl.question(texto, (respuesta) => {
resolve(respuesta);
});
});
}

async function main() {
const nombre = await pregunta('¿Cómo te llamas? ');
const edad = await pregunta('¿Cuántos años tienes? ');
const ciudad = await pregunta('¿De dónde eres? ');

console.log(`Hola ${nombre}, tienes ${edad} años y eres de ${ciudad}`);
rl.close();
}

main();

Alternativa: readline/promises (Node.js 17+)

A partir de Node.js versión 17, existe una versión del módulo que trabaja nativamente con Promises:

const readline = require('readline/promises');

const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});

async function main() {
const nombre = await rl.question('¿Cómo te llamas? ');
const edad = await rl.question('¿Cuántos años tienes? ');

console.log(`Hola ${nombre}, tienes ${edad} años`);
rl.close();
}

main();