Módulo readline de Node.js
De Node.jsreadlineEl módulo es una interfaz para leer de un flujo legible (por ejemplo,process.stdin) línea por línea. Proporciona una forma sencilla de manejar la entrada de la línea de comandos, muy adecuada para crear aplicaciones interactivas de línea de comandos.
Uso básico
Introducir el módulo readline
Para usarreadlineel módulo, primero debe importarlo:
Crear una interfaz readline
Crearreadline.Interfacela instancia es el núcleo del uso del módulo:
Ejemplo
input: process.stdin,
output: process.stdout
});
Aquí creamos una interfaz que lee datos de la entrada estándar (teclado) y escribe la salida en la salida estándar (consola).
Métodos y eventos principales
Leer entrada línea por línea
Usarquestion()el método permite preguntar al usuario y esperar una respuesta:
Ejemplo
console.log(`Hola, $`{answer}!`);
rl.close();
});
Escuchar el evento line
Cuando el usuario introduce una línea y presiona Enter, se activalineel evento:
Ejemplo
console.log(`Recibido: $`{input}`);
if (input === 'exit') {
rl.close();
}
});
Cerrar la interfaz
Usarclose()el método cierra la interfaz y libera recursos:
Ejemplo
Cuando la interfaz se cierra, se activacloseel evento:
Ejemplo
console.log(`'¡Adiós!'`);
process.exit(0);
});
Funciones avanzadas
Historial
readlineEl módulo admite el historial de comandos:
Ejemplo
El usuario puede usar las teclas de flecha arriba y abajo para navegar por el historial de comandos.
Autocompletado personalizado
Se puede implementar una función de autocompletado con Tab personalizada:
Ejemplo
const completions = ['help', 'exit', 'show'];
const hits = completions.filter((c) => c.startsWith(line));
return [hits.length ? hits : completions, line];
});
Control del cursor
readlineSe proporcionan algunos métodos para controlar el cursor:
Ejemplo
readline.clearLine(process.stdout, 0); `// Limpiar la línea actual`
readline.clearScreenDown(process.stdout); `// Limpiar el contenido debajo del cursor`
Ejemplos de aplicaciones prácticas
Crear un sencillo programa de preguntas y respuestas por línea de comandos
Ejemplo
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
const questions = [
`'¿Cómo te llamas?'`,
`'¿Cuántos años tienes?'`,
`'¿Cuál es tu lenguaje de programación favorito?'`
];
const answers = [];
function askQuestion(i = 0) {
if (i >= questions.length) {
console.log(`'Gracias por tus respuestas:'`, answers);
return rl.close();
}
rl.question(questions[i], (answer) => {
answers.push(answer);
askQuestion(i + 1);
});
}
askQuestion();
Crear una sencilla calculadora de línea de comandos
Ejemplo
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
function calculator() {
rl.question(`'Ingrese una expresión (por ejemplo: 2 + 3 o escriba exit para salir): '`, (input) => {
if (input === 'exit') {
return rl.close();
}
try {
const result = eval(input); `// Nota: en una aplicación real, evite usar eval directamente`
console.log(`Resultado: ${result}`);
} catch (e) {
console.log(`'Expresión inválida'`);
}
calculator(); `// Llamada recursiva para continuar con el siguiente cálculo`
});
}
calculator();
Consideraciones de seguridad
Evite usar eval(): el ejemplo de calculadora anterior usó
eval()lo cual no es seguro en un entorno de producción porque ejecutaría cualquier código JavaScript ingresado.Validación de entrada: valide siempre la entrada del usuario para prevenir ataques de inyección u otros problemas de seguridad.
Manejo de errores: agregue un manejo de errores adecuado para todas las operaciones asíncronas.
Resumen
De Node.jsreadlineel módulo es una potente herramienta para construir herramientas interactivas de línea de comandos. Con él podemos:
- Obtener fácilmente la entrada del usuario
- Crear interfaces interactivas de preguntas y respuestas
- Implementar el historial de comandos
- Añadir la función de autocompletado con Tab
- Controlar el cursor y la salida de la terminal
Dominarreadlineel módulo es un paso importante en el desarrollo de herramientas de línea de comandos de Node.js. Espero que este artículo te ayude a comprender y usar este módulo.
Módulos integrados de Node.js