Introducción a Express.js: conexión a una base de datos PostGIS

Express es un framework, escrito en JavaScript y alojado dentro del entorno de ejecución NodeJS. Express está diseñado para simplificar el desarrollo de aplicaciones web y APIs en Node.js al proporcionar una capa de abstracción sobre el servidor HTTP incorporado de Node.js, lo que facilita la creación de servidores web y la gestión de rutas, solicitudes, respuestas… Estos motivos hacen de Express uno de los frameworks mas utilizados de NodeJS.

Características de Express

Algunas de la principales características de Express son:

  • Express utiliza middleware para manejar las solicitudes HTTP. Esto permite agregar funcionalidades adicionales a la aplicación, como el manejo de sesiones, la autenticación, la compresión de respuestas, etc…
  • Express proporciona un enrutador que facilita la definición de rutas para manejar diferentes solicitudes HTTP (GET, POST, PUT, DELETE, etc.). Express proporciona métodos y propiedades para manejar las solicitudes HTTP entrantes y generar respuestas. Esto incluye el envío de respuestas JSON, archivos estáticos, redirecciones, entre otros.
  • Express es compatible con una amplia variedad de bases de datos, como MongoDB, MySQL, PostgreSQL, entre otros.
  • Express es flexible y permite a los desarrolladores estructurar una aplicación de la manera que mejor se adapte a cada situación. Además, es altamente extensible, lo que significa que se pueden agregar funcionalidades adicionales mediante el uso de middlewares o la creación de módulos personalizados.

Cómo instalar Express

Express se instala mediante NPM (Node Package Manager) que es el administrador de paquetes predeterminado para Node.js

1º. Creamos una nueva carpeta para albergar el proyecto:

mkdir mi-app-express

2º. Nos dirigimos a la carpeta que hemos creado:

cd mi-app-express

3º. Inicializamos un nuevo proyecto con Node:

npm -y init

Esta orden inicializa un nuevo proyecto de Node.js con un archivo package.json predeterminado sin necesidad de responder a ninguna pregunta o configuración adicional. Indica a npm que utilice los valores predeterminados para todas las preguntas que normalmente se hacen durante la inicialización del proyecto.

4º. Instalar Espress.js

npm install express

Este comando se utiliza para  instalar el paquete Express en un proyecto de Node.js. Con esto tendríamos instalado Express y podemos empezar a trabajar.

Una aplicación mínima

Una primera aplicación muy sencilla que nos puede servir para ver cómo funciona Express es la siguiente:

var express = require('express');
var app = express();


app.get('/', function(req, res) {
  res.send('Hola Mundo');
});

const port = 3000;
// Iniciar el servidor
app.listen(port, () => {
    console.log(`Servidor Express escuchando en el puerto ${port}`);
  });

En la primera línea se importa el módulo Express y a continuación se crea una instancia llamando a la función express().

app.get(‘/’, function(req, res) { res.send(‘Hola Mundo’); });: Esta línea define una ruta GET para la ruta raíz (‘/’). Cuando se realiza una solicitud GET a la ruta raíz, la función de controlador especificada se ejecutará. En este caso, la función de controlador toma dos argumentos: req (la solicitud HTTP entrante) y res (la respuesta HTTP saliente). La función de controlador responde a la solicitud con el típico mensaje de «Hola Mundo» utilizando res.send().

Por último se define el puerto en que se escucharán las solicitudes entrantes, que en este ejemplo, como se puede ver es 3000. A continuación se utiliza el método listen para iniciar el servidor y se emite un mensaje indicando el puerto en que se está escuchando.

Crear rutas

En el ejemplo anterior hemos utilizado la ruta raíz (‘/’) para crear la página con el texto «Hola Mundo». Podemos definir nuevas rutas añadiendo lo siguiente al código anterior.

// Ruta para mostrar un mensaje personalizado
app.get('/saludo/:nombre', (req, res) => {
    const nombre = req.params.nombre;
    res.send(`¡Hola, ${nombre}!`);
  });

// Ruta para manejar todas las demás solicitudes
app.get('*', (req, res) => {
    res.status(404).send('Página no encontrada');
  });

Aquí hemos creado dos nuevas rutas.

  • ‘/saludo/:nombre’ crea una ruta llamada saludo con una propiedad llamada nombre. Esto hace que al acceder a esta ruta se pueda pasar un nombre para que nos responda con un mensaje personalizado. Por ejemplo al escribir http://localhost:3000/saludo/MappingGIS en la barra del navegador obtendremos una página con el saludo y el nombre indicado.
  • ‘*’ lo que hace es enviarnos un mensaje de error cuando escribimos alguna ruta que no esta definida.

Lanzar el servidor

Una vez que tenemos el código escrito, lo guardamos en la carpeta del proyecto con un nombre, como por ejemplo server.js. Para arrancar la aplicación escribimos en un terminal node server.js

node server.js

Obtendremos un mensaje indicando el puerto en que está escuchando Express:

Si escribimos en el navegador http://localhost:3000/saludo/MappingGIS, estamos utilizando la ruta saludo y pasando como nombre MappingGIS por lo tanto veremos un saludo personalizado con el nombre:

¿Que es un middleware en Express?

Un middleware es una función que tiene acceso a los objetos de solicitud (req), a los objetos de respuesta (res) y a  la función next en el ciclo de solicitud-respuesta de la aplicación. Para entenderlo mejor modificaremos el ejemplo en el que estamos trabajando para añadir un nuevo middleware. El código queda de la siguiente forma:

var express = require('express');
var app = express();

// Middleware para registrar solicitudes
app.use((req, res, next) => {
    console.log(`Solicitud recibida: ${req.method} ${req.url} en ${new Date()}`);
    next(); // Llama a la función next() para pasar la solicitud al siguiente middleware
  });
  
app.get('/', function(req, res) {
  res.send('Hola Mundo');
});

// Ruta para mostrar un mensaje personalizado
app.get('/saludo/:nombre', (req, res) => {
    const nombre = req.params.nombre;
    res.send(`¡Hola, ${nombre}!`);
  });

// Ruta para manejar todas las demás solicitudes
app.get('*', (req, res) => {
    res.status(404).send('Página no encontrada');
  });

const port = 3000;
// Iniciar el servidor
app.listen(port, () => {
    console.log(`Servidor Express escuchando en el puerto ${port}`);
  });

El primer middleware se define con app.use() y se ejecutará en todas las solicitudes.  Este middleware es independiente de la ruta y recibe tres argumentos: req (la solicitud HTTP entrante), res (la respuesta HTTP saliente) y next (una función de devolución de llamada) que se utiliza para pasar la solicitud al siguiente middleware. En este caso, el middleware registra los detalles de la solicitud (método HTTP, URL y hora de llegada) en la consola utilizando console.log(), y luego llama a next() para continuar con el procesamiento de la solicitud:

El segundo middleware se define con app.get(). Este middleware solo se ejecutará para solicitudes GET a la ruta raíz (‘/’) y ya conocemos su funcionamiento.

Conectar Express a una base de datos PostGIS

Entre las características de Express que vimos antes, citábamos su compatibilidad con Bases de Datos como PostgreSQL. Utilizaremos esta posibilidad para obtener los datos de una tabla de PostGIS. Nuestra aplicación se compone de dos archivos separados, en el primero definiremos los parámetros de la conexión y en el segundo realizaremos las solicitudes a la base de datos:

// dbConfig.js
const dbConfig = {
  host: 'localhost',
  port: 5432,
  database: 'world',
  user: '********',
  password: '********',
};

module.exports = dbConfig;

El archivo que hemos llamado dbconfig.js, como se puede observar, contiene solamente los parámetro de la conexión como son el host, el puerto, el nombre de usuario, la contraseña y el nombre de la base de datos para conectarse a PostgreSQL.

El archivo para hacer la solicitud a la base de datos es el siguiente:

const express = require('express');
const cors = require('cors');
const { Pool } = require('pg');
const dbConfig = require('./dbConfig');

const app = express();
const port = 5000;

// Middleware para habilitar CORS
app.use(cors());

// Configuración de la conexión a la base de datos
const pool = new Pool(dbConfig);

// Ruta de ejemplo para obtener datos de la base de datos
app.get('/datos', async (req, res) => {
  try {
    const result = await pool.query('SELECT * FROM public.lugares');
    res.json(result.rows);
   
  } catch (error) {
    console.error('Error al obtener datos:', error);
    res.status(500).json({ error: 'Error interno del servidor' });
  }
});

// Inicia el servidor
app.listen(port, () => {
  console.log(`Servidor Express escuchando en el puerto ${port}`);
});

Además de importar Express necesitamos:

  • Importar el middleware cors que se utiliza para habilitar el intercambio de recursos entre diferentes dominios (CORS) en la aplicación.
  • Importar la clase Pool del módulo pg, que es el cliente de PostgreSQL para Node.js. La clase Pool se utiliza para manejar la conexión y la interacción con la base de datos PostgreSQL.
  • Importar la configuración de la base de datos desde el  archivo dbConfig.js que creamos antes.

app.get(‘/datos’, async (req, res) => { … });: Define una ruta GET en la ruta /datos. Cuando se acceda a esta ruta a través de una solicitud HTTP GET, se ejecutará el controlador especificado. En este caso, el controlador realiza una consulta a la base de datos PostgreSQL para obtener datos de una tabla llamada lugares. Si la consulta es exitosa, los datos se devuelven como una respuesta JSON. Si ocurre algún error, se envía una respuesta de error con el estado 500.

En conclusión, Express.js ofrece una combinación de minimalismo, flexibilidad, facilidad de uso y rendimiento que lo convierte en una opción popular para el desarrollo de aplicaciones web en Node.js.

2 comentarios en «Introducción a Express.js: conexión a una base de datos PostGIS»

  1. Muchas gracias Georges por tu comentario y aportación.
    Como bien indicas este artículo de introducción a Node, Express y PostGIS devuelve los datos en JSON. La conversión a formato GeoJSON es útil en muchos casos y se puede hacer empleando las funciones de PostGIS como propones.
    Saludos.

    Responder
  2. Hola,
    gracias por la buena introducción a Node, Express y PostGIS.
    Por desgracia, falta el último paso, es decir, cargar los datos en OpenLayers, por ejemplo.
    Su consulta devuelve JSON, pero no GeoJSON, que es necesario como fuente de datos para una capa vectorial en OpenLayers, por ejemplo.

    La consulta tendría que ser modificada de la siguiente manera para que devuelva una FeatureCollection:

    SELECT jsonb_build_object(‘type’,’FeatureCollection’, ‘features’, jsonb_agg(feature))
    FROM (SELECT jsonb_build_object(‘type’,’Feature’,’id’,gid,’geometry’,ST_AsGeoJSON(geom)::jsonb,’properties’, to_jsonb(row) – ‘the_geom’) AS feature
    FROM (SELECT * FROM public.lugares) row) features;»;

    el res debe tener este aspecto:
    res.json(result.rows[0].jsonb_build_object);

    Responder

Deja un comentario