Esta es una traducción que desde EGA Futura ofrecemos como cortesía a toda la Ohana y comunidad de programadores , consultores , administradores y arquitectos de Salesforce para toda Iberoamérica .

El enlace a la publicación original, lo encontrarás al final de este artículo.

Si ha estado siguiendo nuestra serie de blogs, "Introducción a Node.js para desarrolladores de Salesforce", habrá aprendido mucho hasta ahora sobre este popular tiempo de ejecución de JavaScript de código abierto. Nuestras dos publicaciones anteriores discutieron por qué Node.js es importante para los desarrolladores de Salesforce y lo guiaron a través de cómo construir su primera aplicación web usando Node.js.

En esta tercera publicación de la serie, aprenderá cómo acceder a una base de datos PostgreSQL usando Heroku Postgres y Node.js. Al hacerlo, utilizará la base de datos relacional de código abierto más avanzada dentro de sus aplicaciones y podrá sincronizar fácilmente los datos con Salesforce utilizando productos como Heroku Connect .


Arquitectura de invocación

Trabajaremos con la aplicación conference-lwc-app de la publicación anterior del blog , así que asegúrese de leerla. He insertado el código fuente en el repositorio heroku-examples / conference-api en GitHub; puedes clonarlo usando Git ejecutando:

 clon de git https://github.com/heroku-examples/conference-api

Introducción a npm

Antes de comenzar este proyecto, echemos un vistazo a npm , la puerta de entrada al ecosistema de Node y JavaScript. Npm es el registro de paquetes de JavaScript; es donde puede encontrar todas las bibliotecas y herramientas que necesita para desarrollar aplicaciones con JavaScript y Node.js. ¿Sabía que LWC y las CLI de Salesforce y Heroku se publican en npm? ¡Ahora lo sabes!

Con cada instalación de Node.js, también obtienes el npm , que se usa para instalar dependencias en tus proyectos, como en la publicación anterior del blog donde instalamos fastify y fastify-cors . Para este nuevo proyecto, instalaremos pg , el controlador de PostgreSQL para Node.js.

Creando una base de datos de Heroku Postgres

Usaremos una instancia de PostgreSQL de Heroku, lo que significa que no es necesario instalar el servidor en su máquina de desarrollo local. Sin embargo, se recomienda instalar psql , el cliente PostgreSQL, para que pueda interactuar con la base de datos desde la CLI. El Centro de desarrollo de Heroku proporciona instrucciones sobre cómo configurar PostgreSQL en su entorno local.

Para tener una instancia de Heroku Postgres, necesitará una aplicación. Entonces, creemos uno ejecutando el siguiente comando desde la carpeta de su proyecto conference-api

 heroku create <your-app-name>

Nota: asegúrese de reemplazar <your-app-name> con un nombre de aplicación único.

A continuación, agregue un complemento de Heroku Postgres a su aplicación ejecutando:

 complemento heroku: crea heroku-postgresql: hobby-dev

Aquí está utilizando el hobby-dev , que es gratuito y perfecto para el desarrollo, pero tiene algunas limitaciones para los entornos de producción. Si desea obtener más información sobre los planes disponibles, consulte la página de complementos de Heroku Postgres .

Puede confirmar que tiene acceso ejecutando psql través de la CLI de Heroku ejecutando:

 heroku pg: psql

Ahora, puede ejecutar una consulta SQL y hacer algo como SELECT now(); para obtener la fecha y hora actuales.

Nota: Para usar heroku pg:psql , necesitará instalar el cliente PostgreSQL en su máquina local.

La principal ventaja de usar el complemento Heroku CLI pg es que no necesita preocuparse por los detalles de autenticación; la CLI se encargará de ello por usted.

Crear un esquema de base de datos

Se ha conectado a la instancia de PostgreSQL; ahora necesita crear algunas tablas para almacenar información. Echemos un vistazo al esquema de datos que necesita crear para la aplicación conference-api

La API construida en la publicación anterior del blog devuelve una estructura JSON compuesta por sesiones y sus hablantes , así que creemos las tablas de estas dos entidades y su tabla de relaciones usando SQL CREATE TABLE (consulte los documentos para obtener más información).

Copie el siguiente código SQL en un schema.sql en la carpeta de su proyecto. Lo cargará en la base de datos mediante la CLI de Heroku.

 CREAR sesiones de TABLA
( id bigserial NO NULO, carácter del nombre que varía NOT NULL, carácter de descripción que varía NOT NULL, carácter de la habitación que varía NOT NULL, marca de tiempo de fecha y hora con zona horaria NO NULO, LLAVE PRIMARIA (id)
); CREAR altavoces de mesa
( id bigserial NO NULO, carácter del nombre que varía NOT NULL, carácter bio que varía NOT NULL, carácter de correo electrónico que varía NOT NULL, imagen_url carácter variable NOT NULL, LLAVE PRIMARIA (id)
); CREAR TABLA session_speakers
( session_id bigserial NO NULO, speaker_id bigserial NOT NULL
); ALTER TABLE session_speakers AÑADIR CONSTRAINT FK_sessions_TO_sessions_speakers LLAVE EXTRANJERA (session_id) REFERENCIAS sesiones (id); ALTER TABLE session_speakers AÑADIR CONSTRAINT FK_speakers_TO_sessions_speakers LLAVE EXTRANJERA (speaker_id) REFERENCIAS altavoces (id);

archivo schema.sql

Después de guardarlo, puede copiarlo directamente al heroku pg:psql , o puede ejecutar el siguiente comando para importar el archivo completo:

 heroku pg: psql <schema.sql

Nota: El comando anterior solo funcionará en MacOS, Linux o WSL. Si está utilizando Windows, le recomiendo que copie el contenido del archivo en el heroku pg:psql lugar.

Ahora es el momento de la refactorización. En las siguientes secciones, hará dos cosas:

  • Cree un script de migración para cargar los sessions.json en la base de datos.
  • Modifique la /api/sessions para consultar estos datos y devolverlos en formato JSON.

Insertar datos en la base de datos

Su próximo trabajo es insertar los datos del data/sessions.json en la base de datos. ¡Ingrese node-postgres !

Node-postgres, o pg , es el controlador de PostgreSQL para Node.js. Necesita esto para interactuar con la base de datos PostgreSQL de Node.js, y dado que se trata de una dependencia externa, deberá instalarlo en su proyecto usando npm:

 npm install pg

Para conectarse a una base de datos de Postgres, necesitará la información de conexión y las credenciales. Dado que este servicio es administrado por Heroku y está adjunto a su aplicación, puede usar la CLI de Heroku para obtener la DATABASE_URL y almacenarla en un .env ejecutando:

 heroku config --shell> .env

Una aplicación de Heroku sigue la metodología de aplicación de 12 factores , que establece que cualquier valor de configuración debe almacenarse en el entorno . Es por eso que la aplicación usa un archivo .env esos archivos se utilizan para configurar las variables de entorno localmente por proyecto.

Nota: No olvide agregar el .env a su .gitignore . Esto evitará que sus credenciales se filtren a su sistema de control de versiones.

Utilizará el dotenv para cargar el .env automáticamente cada vez que ejecute un script. Asegúrese de instalar esto también ejecutando:

 npm instalar dotenv

Después de esto, podrá acceder a las variables de entorno almacenadas en el .env accediendo a la process.env en Node.js.

Ahora, creemos una instancia del cliente PostgreSQL usando la cadena de conexión del entorno:

 // Carga el archivo `.env`
require ('dotenv'). config () // Requiere el cliente PostgreSQL
const {Cliente} = require ('pg') // Crea una instancia de cliente
cliente const = nuevo cliente ({ connectionString: process.env.DATABASE_URL, ssl: { rechazar Sin autorización: falso }
})

Nota: Dado que se está conectando a la base de datos localmente y en Heroku, se recomienda configurar el rejectUnauthorized propiedad a false para evitar problemas con el certificado TLS durante la conexión PostgreSQL.

La creación de una Client es buena para conexiones únicas. Para esta sección, vamos a crear un migrate.js script que va a cargar el sessions.json archivo en la base de datos. Los dos métodos que utilizará aquí son: client.connect() para establecer una conexión a la base de datos y client.query para realizar consultas SQL.

 esperar client.connect ()
...
aguardar cliente.query (` INSERT INTO sesiones (id, nombre, descripción, sala, fecha y hora VALORES ($ 1, $ 2, $ 3, $ 4, $ 5)
`, [sessionId, sessionName, description, room, dateTime])

Echemos un vistazo al script migrate.js Puede copiarlo en el data de su proyecto.

 require ('dotenv'). config () // Requiere cliente PostgreSQL
const {Cliente} = require ('pg') // Cargar sesiones desde un archivo JSON
ruta constante = require ('ruta')
sesiones const = require (path.join (__ dirname, './sessions.json')) // Crea un cliente de base de datos
cliente const = nuevo cliente ({ connectionString: process.env.DATABASE_URL, ssl: { rechazar Sin autorización: falso }
}) función asíncrona migrate () { tratar { // Conectarse a la base de datos esperar client.connect () // Recorre cada sesión para (sesión const de sesiones.datos) { // Insertar sesión en la base de datos const {id: sessionId, name: sessionName, description, room, dateTime} = sesión console.log (`Creando sesión: $ {sessionName}`) aguardar cliente.query (` INSERT INTO sesiones (id, nombre, descripción, sala, fecha y hora) VALORES ($ 1, $ 2, $ 3, $ 4, $ 5) SOBRE EL CONFLICTO NO HACER NADA `, [sessionId, sessionName, description, room, dateTime] ) .catch (err => console.error (err)) // Comprueba si la sesión tiene ponentes if (Array.isArray (session.speakers)) { // Bucle a través de cada altavoz para (const speaker of session.speakers) { // Insertar altavoz en la base de datos const {id: speakerId, name: speakerName, bio, email, pictureUrl} = speaker console.log (`Añadiendo altavoz: $ {speakerName}`) aguardar cliente.query (` INSERT INTO Speakers (id, name, bio, email, picture_url) VALORES ($ 1, $ 2, $ 3, $ 4, $ 5) SOBRE EL CONFLICTO NO HACER NADA `, [speakerId, speakerName, bio, email, pictureUrl] ) // Agregar relación entre la sesión y el orador aguardar cliente.query (` INSERT INTO session_speakers (session_id, speaker_id) VALORES ($ 1, $ 2) SOBRE EL CONFLICTO NO HACER NADA `, [sessionId, speakerId] ) } } } console.log ('Datos migrados correctamente') process.exit (0) } atrapar (err) { console.error (err) process.exit (1) }
} // Ejecuta la migración
emigrar()

Consultar datos de la base de datos

En el script de migración, usó el Client para realizar la conexión a la base de datos. Tiene sentido en ese contexto porque será solo una conexión, pero en un servidor web real como la API que está escribiendo, es mejor usar un grupo de conexiones para manejar mejor los recursos.

Va a volver a escribir la /api/sessions ruta en server.js utilizar un cliente Pool en su lugar. Los parámetros de las conexiones son los mismos que con el Client . También puede definir el número máximo de clientes en el grupo, pero usemos el predeterminado para este ejemplo. Si desea obtener más información sobre la Pool , consulte la documentación.

 const {Pool} = require ('pg')
const client = new Pool ({ connectionString: process.env.DATABASE_URL, ssl: { rechazar Sin autorización: falso }
})
...
const {filas} = aguardar cliente.query (`SELECCIONAR ID, nombre, descripción DE las sesiones`)

Ahora puede realizar consultas utilizando el cliente. Esto podría ser algo simple como un SELECT normal de una tabla específica o algo más complejo como la consulta que necesita para la ruta de la API. Como puede ver, aquí estamos aprovechando el poder de PostgreSQL para construir objetos JSON a partir de una consulta usando las funciones JSON (compatibles con Postgres 9.6) y disponibles en Heroku Postgres.

 fastify.get ('/ api / sessions', async (solicitud, respuesta) => { const {filas} = aguardar cliente.query (` SELECCIONAR json_build_object ( 'id', t.id, 'nombre', t.nombre, 'descripción', t.description, 'habitación', t.room, 'dateTime', t.datetime, 'altavoces', json_agg (json_build_object ( 'id', s.id, 'nombre', s.nombre, 'bio', s.bio, 'pictureUrl', s.picture_url )) ) como sesión DESDE sesiones t INNER JOIN session_speakers ts ON ts.session_id = t.id INNER JOIN oradores s ON ts.speaker_id = s.id GRUPO POR t.id PEDIR POR t.id `) devolver filas
})

Y eso es; después de volver a escribir la ruta, lo último que deberá hacer es confirmar sus cambios en Git e implementarlos en Heroku ejecutando:

 git push heroku principal

Ahora ha aprendido cómo acceder a una base de datos PostgreSQL desde Node.js usando node-postgres. Asegúrese de consultar la documentación para conocer más funciones y opciones de configuración.

Además, si prefiere un formato de video, eche un vistazo a Using PostgreSQL with Node.js , un video que publicamos en nuestro canal de YouTube de Salesforce Developers (¡y no olvide suscribirse!).

¿Que sigue?

En la siguiente y última publicación del blog de nuestra serie Node.js, aprenderá cómo integrar esta aplicación Node.js con una aplicación Salesforce usando Heroku Connect.

Sobre el Autor


Julián Duque es un defensor de desarrolladores líder en Salesforce. Si quieres ponerte en contacto con él, simplemente ejecuta:

 npx julianduque

Esta es una traducción realizada por EGA Futura, y este es el link a la publicación original: https://developer.salesforce.com/blogs/2021/11/accessing-a-postgresql-database-from-node-js.html

Entradas recomendadas