← Node & Express

Coding challenge

write a middleware that logs the method, url, and response time.

Challenge: write a middleware that logs the method, url, and response time.
Input: any request to the server.
Expected output: a console line like:
  GET / 200 - 3ms

How to test it:
  1. npm install
  2. node 06-retos-codigo/logger-middleware.js
  3. curl http://localhost:3000/  and watch the server console
Show solution
// 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 };