API con Node.js, Express y Prisma

Base de datos

Uno de los aspectos fundamentales en las aplicaciones es la persistencia de datos, si por algún motivo la aplicación se cierra los datos no se pierdan, adicionalmente tener la posibilidad de realizar copias de seguridad y brindar los mecanismos para su recuperación, todo lo anterior descrito es cubierto por un gestor de base de datos.

Existen muchas opciones de bases de datos, desde código abierto, de uso libre y pagas, tanto SQL como NOSQL, etc. Cada una de ellas con características específicas, la selección de una o varias según el caso siempre dependerá del tipo de aplicación que se esté diseñando.

PostgreSQL

Utilizaremos el gestor de base de datos PostgreSQL la cual es código abierto, de libre uso y bastante popular. Como su nombre lo indica, es una base de datos tipo SQL, por lo tanto, los recursos estarán asociados a tablas y cada entidad a un registro.

En la página oficial de PostgreSQL se encuentran los instaladores para cada uno de los diferentes sistemas operativos.

PostgreSQL se puede administrar desde la Terminal o la interfaz gráfica de pgAdmin donde se pueden crear usuarios, bases de datos, tablas e información.

Normalmente, una vez se instale la base de datos, el nombre de usuario y contraseña por defecto son postgres en ambos casos y el nombre de la base de datos por defecto también es postgres, así como el puerto 5432donde el proceso se ejecuta.

Existen servicios en la nube que brindan PostgreSQL como servicio, los cuales se necesitarán a la hora de publicar la API en un servidor o servicio.

Prisma

Prisma es un ORM (Object Relational Mapping) que facilita la interacción con la base de datos desde la aplicación mediante una capa intermedia, brinda una serie de métodos para realizar las operaciones más comunes.

Otra característica importe es asegurar la independencia del tipo de base de datos que se seleccione, por lo tanto, si en un futuro deseamos migrar a otra base de datos sería sencillamente cambiar el tipo proveedor de base de datos y si es necesario ajustes específicos en los modelos, pero no el código fuente de nuestra aplicación.

Se recomienda instalar la extensión de Prisma para Visual Studio Code, así cada vez que guarde el documento con extensión .prisma, esta ajustará el formato y adicionalmente sugiere y autocompleta texto cuando se está trabajando en los archivos de este tipo:

Más información:

Conectar Prisma y la base de datos

El primer paso es instalar Prisma como dependencia de desarrollo y el cliente de Prisma como una dependencia del proyecto:

npm install prisma --save-dev
npm install @prisma/client

Luego inicializarlo con el proveedor seleccionado en este caso PostgreSQL:

npx prisma init --datasource-provider postgresql

Se necesitará una URL que nos indique a qué base de datos debemos conectarnos, se añade la variable con sus respectivos valores en el archivo .env:

PORT=3000
DATABASE_URL=postgresql://postgres:postgres@localhost:5432/checklistdb

I> Es importante también colocar las mismas variables en el archivo .env.example con valores de ejemplo

Como se puede observar, el protocolo de conexión será postgresql, el nombre de usuario y contraseña postgres, la dirección de la máquina local localhost, el puerto 5432 y el nombre de la base de datos será checklistdb.

Se crea un módulo que tendrá la responsabilidad de administrar las operaciones relacionadas con la conexión y desconexión de la base de datos, dentro de su respectivo directorio:

touch app/database.js
// app/database.js

import { PrismaClient } from '@prisma/client';

export const prisma = new PrismaClient();

export const connect = async function () {
  await prisma.$connect();
  console.log('Database connected');
};

export const disconnect = async function () {
  await prisma.$disconnect();
  console.log('Database disconnected');
};

En el fragmento de código anterior:

  1. Se importa la librería del @prisma/client.
  2. Se crea una nueva instancia de Prisma y se exporta para ser utilizada en toda la aplicación.
  3. Se exporta la función llamada connect y disconnect que se encargará de realizar la conexión y desconexión de la base de datos respectivamente.

No es necesario en la función de conexión especificar los datos de conexión a la base de datos, ya que Prisma adopta las buenas prácticas y automáticamente selecciona esta información de la variable de entorno DATABASE_URL.

Ahora en el archivo principal añadimos el módulo, la configuración y se conecta a la base de datos:

// index.js

import http from 'http';

import { configuration } from './app/config.js';
import { app } from './app/index.js';
import { connect } from './app/database.js';

const { port } = configuration.server;

// Connect to the database
connect();

// Create Web Server
const server = http.createServer(app);

server.listen(port, () => {
  console.log(`Server running at port: ${port}`);
});

I> Como se efectuaron cambios en los archivos de configuración se debe reiniciar el servidor para que este tome los cambios.

Ahora el archivo principal sigue teniendo la misma responsabilidad que es levantar todos los servicios de la conexión a la base de datos y el servidor Web.

Más información: