// Reto: escribir un middleware que loguee metodo, url y tiempo de respuesta.
// Entrada: cualquier peticion al servidor.
// Salida esperada: una linea en consola como:
// GET / 200 - 3ms
//
// Como probarlo:
// 1. npm install
// 2. node 06-retos-codigo/logger-middleware.js
// 3. curl http://localhost:3000/ y mira la consola del servidor
const express = require("express");
const app = express();
const PORT = process.env.PORT || 3000;
// Un middleware es una funcion (req, res, next).
// Corre ANTES de los handlers de ruta y debe llamar a next() para
// pasar el control al siguiente middleware o ruta.
function logger(req, res, next) {
// Guardamos el momento en que llego la peticion.
const inicio = Date.now();
// El truco: nos suscribimos al evento "finish" de la respuesta.
// Ese evento se dispara cuando Express YA termino de enviar la respuesta,
// asi que ahi ya conocemos el status final y podemos medir el tiempo.
res.on("finish", () => {
const duracion = Date.now() - inicio;
console.log(`${req.method} ${req.originalUrl} ${res.statusCode} - ${duracion}ms`);
});
// Pasamos el control. Si olvidamos esto, la peticion se queda colgada.
next();
}
// app.use registra el middleware para TODAS las rutas.
// El orden importa: debe ir antes de las rutas que queremos loguear.
app.use(logger);
app.get("/", (req, res) => {
res.json({ mensaje: "Ruta con logger" });
});
app.get("/lento", (req, res) => {
// Simulamos una respuesta lenta para ver un tiempo mayor en el log.
setTimeout(() => res.json({ mensaje: "Respuesta lenta" }), 50);
});
app.listen(PORT, () => {
console.log(`Servidor con logger en http://localhost:${PORT}`);
});
module.exports = { app, logger };