Usa async/await en tus rutas y gestiona los errores asíncronos sin tumbar el servidor.
Abrir esta lección en KodokonTus rutas reales no devuelven arrays en memoria: leen archivos, consultan una base de datos, llaman a otras APIs. Todas estas operaciones son asíncronas. Conoces async/await desde el curso de JavaScript; veamos cómo usarlos de forma limpia en un servidor. Primera buena noticia: una función de ruta puede ser async.
import express from "express";
import { readFile } from "node:fs/promises";
const app = express();
app.get("/report", async (req, res) => {
const raw = await readFile("report.json", "utf8");
res.json(JSON.parse(raw));
});
app.listen(3000);Este código funciona... siempre que report.json exista. Si la lectura falla, la promesa se rechaza y, según la versión de Express, la petición se queda sin respuesta o el error se filtra en los logs. La regla profesional: cada ruta async gestiona sus errores, con try/catch y next(error).
app.get("/report", async (req, res, next) => {
try {
const raw = await readFile("report.json", "utf8");
res.json(JSON.parse(raw));
} catch (error) {
next(error);
}
});next(error) pasa el error al gestor de errores centralizado. Es un middleware con cuatro parámetros, declarado después de todas las rutas. Un único lugar para registrar y dar formato a los errores: eso es lo que distingue una API mantenible de un proyecto de fin de semana.
app.use((err, req, res, next) => {
console.error(err);
res.status(500).json({
error: "Internal server error"
});
});Un último reflejo que debes desarrollar: el paralelismo. Dos operaciones independientes encadenadas con dos await se ejecutan una tras otra. Promise.all las lanza juntas: el tiempo de respuesta es el de la más lenta, no la suma de las dos.
async function fetchUsers() {
return [{ id: 1, name: "Ada" }];
}
async function fetchTasks() {
return [{ id: 1, title: "Review the code" }];
}
app.get("/dashboard", async (req, res, next) => {
try {
const [users, tasks] = await Promise.all([
fetchUsers(),
fetchTasks()
]);
res.json({ users, tasks });
} catch (error) {
next(error);
}
});async, ¿qué haces con un error capturado por catch?console.log y seguir adelantenext(error) para pasarlo al gestor de erroresawait sucesivosPromise.allsetTimeout entre las doserr primeroerrorHandler