Guía de Consumo de JSON con Node.js y Express

Una tarea común en el desarrollo web es consumir información desde un archivo JSON o una API. En este tutorial, exploraremos cómo realizar solicitudes HTTP y manejar respuestas JSON en Node.js y Express, facilitando la integración de datos externos en tus aplicaciones.

1Estructura del proyecto

javascript
// Estructura del proyecto
proyecto/
├── data/
│   └── usuarios.json
├── src/
│   └── app.js
├── package.json
└── README.md

2Configuración inicial

javascript
const express = require('express');
const fs = require('fs').promises;
const path = require('path');

const app = express();
const PORT = process.env.PORT || 3000;

3Leer archivo JSON de forma asíncrona

Esta función asíncrona lee un archivo JSON desde una ruta especificada y lo convierte en un objeto JavaScript. Si ocurre un error al leer el archivo, lo captura y lo muestra en la consola.

javascript
async function leerArchivoJSON(rutaArchivo) {
  try {
      const rawData = await fs.readFile(rutaArchivo, 'utf8');
      return JSON.parse(rawData);
  } catch (error) {
      console.error('Error al leer el archivo JSON:', error);
      throw error;
  }
}

4Rutas para consumir datos

La función leerArchivoJSON define una ruta /usuarios en una aplicación Express que, al ser accedida, lee un archivo JSON con los datos de los usuarios y los envía como respuesta. Si ocurre un error al leer el archivo, responde con un mensaje de error y un código de estado 500.

javascript
async function leerArchivoJSON(rutaArchivo) {
  app.get('/usuarios', async (req, res) => {
      try {
          const rutaArchivo = path.join(__dirname, '../data/usuarios.json');
          const usuarios = await leerArchivoJSON(rutaArchivo);
          res.json(usuarios);
      } catch (error) {
          res.status(500).json({ error: 'Error al obtener usuarios' });
      }
  });
}

5Ruta para filtrar usuarios

La ruta /usuarios/filtro permite filtrar usuarios según los parámetros edad y ciudad proporcionados en la consulta. Si no se encuentra el archivo o ocurre un error, responde con un mensaje de error y un código 500.

javascript
app.get('/usuarios/filtro', async (req, res) => {
  try {
      const rutaArchivo = path.join(__dirname, '../data/usuarios.json');
      const usuarios = await leerArchivoJSON(rutaArchivo);
      
      const { edad, ciudad } = req.query;
      const usuariosFiltrados = usuarios.filter(usuario => {
          const coincideEdad = !edad || usuario.edad == edad;
          const coincideCiudad = !ciudad || usuario.ciudad.toLowerCase() === ciudad.toLowerCase();
          return coincideEdad && coincideCiudad;
      });

      res.json(usuariosFiltrados);
  } catch (error) {
      res.status(500).json({ error: 'Error al filtrar usuarios' });
  }
});

Ejemplo de archivo usuarios.json

json
[
  {
      "id": 1,
      "nombre": "urian Viera",
      "edad": 30,
      "ciudad": "Bogota",
      "email": "urian@example.com"
  },
  {
      "id": 2,
      "nombre": "Brenda Catalella",
      "edad": 25,
      "ciudad": "Bogota",
      "email": "brenda@example.com"
  }
]

6Manejo de errores y validación

Este middleware captura errores en la aplicación, los registra en la consola y responde con un mensaje de error y un código 500, indicando que algo salió mal.

javascript
app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).json({ 
      mensaje: 'Algo salió mal', 
      error: err.message 
  });
});

Iniciar servidor

Inicia el servidor Express en el puerto especificado y muestra un mensaje en la consola indicando que el servidor está corriendo y accesible en la URL correspondiente.

javascript
app.listen(PORT, () => {
  console.log(`Servidor corriendo en http://localhost:${PORT}`);
});