← Node.js: JavaScript fuera del navegador

Sesión 6 · Semana 2

Una herramienta de terminal

Hoy · Hoja de ruta

  1. 1. Aprende: Cómo se diseña un programa de terminal que otra persona pueda usar.
  2. 2. Haz: Termina tu CLI del catálogo con sus comandos y su ayuda.
  3. 3. Comprueba: Un compañero lo usa sin que le expliques nada.

Antes de empezar · 5 minutos, sin apuntes

  1. ¿Qué hace un buen programa de terminal cuando lo llamas mal?
  2. ¿Cómo sabes qué comandos acepta un programa que no conoces?
  3. ¿Qué debería imprimir: todo, o lo justo?

El despachador

const comandos = {
  listar: listarProductos,
  buscar: buscarProductos,
  añadir: añadirProducto,
  borrar: borrarProducto,
  ayuda: mostrarAyuda
};

const [, , nombre, ...argumentos] = process.argv;
const comando = comandos[nombre];

if (!comando) {
  console.error(`Comando desconocido: ${nombre ?? "(ninguno)"}`);
  mostrarAyuda();
  process.exit(1);
}

try {
  await comando(argumentos);
} catch (error) {
  console.error(`Error: ${error.message}`);
  process.exit(1);
}

Es el objeto de funciones de la sesión 8 de la UD3, ahora con un cometido real. Añadir un comando es añadir una línea.

Lo que hace usable una herramienta

Regla Por qué
Ayuda con ejemplos reales Nadie lee la documentación antes de probar
Mensajes de error que dicen qué hacer «Falta el precio: añadir <nombre> <precio>»
Código de salida correcto Para poder encadenarla con otras
Silencio cuando todo va bien Un programa que grita no se puede automatizar
Confirmar lo destructivo Borrar sin preguntar se paga caro

El error dice qué esperaba y qué recibió

«Datos inválidos» no sirve para nada. «El precio debe ser un número mayor que cero; se recibió "abc"» dice el problema, el valor y la regla, y quien lo lee sabe qué escribir a continuación.

Es lo mismo que exigías a tus mensajes de validación en la UD4, ahora sin interfaz donde esconderlo.

Salida legible

console.table(productos.map(({ id, nombre, precio, stock }) => ({
  id, nombre, precio, stock
})));

console.table también existe en Node, y para una lista de objetos es la diferencia entre una salida que se lee y un volcado que no.

Tarea 6 · El CLI completo

  1. Implementa listar, buscar, ver, añadir, borrar y ayuda.
  2. Valida los argumentos de cada uno con las funciones de la UD3.
  3. Escribe mensajes de error que digan qué se esperaba.
  4. Devuelve el código de salida correcto en cada caso.
  5. Pide confirmación antes de borrar.
  6. Dale el programa a un compañero, sin explicarle nada, y anota dónde se atasca.
Objetivo mínimoSeis comandos con ayuda, validación y códigos de salida.
Si lo tienesAñade una opción --json que imprima el resultado sin formato.
RetoHaz que el programa funcione también leyendo datos por la entrada estándar.

Cierre de la semana 2

  • El proyecto se arranca leyendo solo el package.json.
  • Entiendes el versionado y el fichero de bloqueo.
  • Tu herramienta valida, informa y termina con el código correcto.
  • Sigues sin instalar dependencias.
Ver respuestas

1 · Explicar cómo se usa y terminar con un código de error.

2 · Qué se esperaba, qué se recibió y cuál es la forma correcta.

3 · Porque un programa silencioso cuando todo va bien se puede encadenar con otros.

Microprueba semanal 2 · 5–10 minutos

Individual, sin IA y sin apuntes.

  1. ¿Qué versiones acepta ^3.2.1? Escribe dos que sí y una que no.
  2. Di cuáles de estos tres se suben al repositorio: node_modules, package-lock.json y .env.
  3. Escribe dos preguntas que te harías antes de instalar una dependencia.
---