Cómo utilizar PostgreSQL con Node.js en Ubuntu 20.04

La autora seleccionó a la Sociedad de Mujeres Ingenieras para recibir una donación como parte del programa Write for DOnations .
Introducción
El ecosistema Node.js ofrece un conjunto de herramientas para interactuar con bases de datos. Una de esas herramientas es node-postgres , que contiene módulos que permiten que Node.js interactúe con la base de datos PostgreSQL . Con node -postgres node-postgres
, podrá escribir programas Node.js que puedan acceder y almacenar datos en una base de datos PostgreSQL.
En este tutorial, utilizará node-postgres
el módulo para conectarse y realizar consultas a la base de datos PostgreSQL (Postgres, para abreviar). Primero, creará un usuario de base de datos y la base de datos en Postgres. Luego, conectará su aplicación a la base de datos Postgres mediante el node-postgres
módulo. Después, utilizará el módulo node-postgres
para insertar, recuperar y modificar datos en la base de datos PostgreSQL.
Prerrequisitos
Para completar este tutorial, necesitarás:
-
Una cuenta de usuario no root con
sudo
privilegios y un firewall habilitado en Ubuntu 20.04. Siga nuestro tutorial Configuración inicial del servidor con Ubuntu 20.04 para configurar su servidor. -
Node.js instalado en Ubuntu. Si no tienes Node.js instalado, sigue Cómo instalar Node.js en Ubuntu 20.04 .
-
PostgreSQL instalado en su servidor. Siga la guía Cómo instalar y usar PostgreSQL en Ubuntu 20.04 para instalar PostgreSQL en Ubuntu.
-
Conocimientos básicos de cómo escribir consultas en PostgreSQL, consulte Introducción a las consultas en PostgreSQL para obtener más detalles.
-
Conceptos básicos sobre cómo escribir un programa Node.js, consulte Cómo escribir y ejecutar su primer programa en Node.js.
-
Conocimientos básicos sobre cómo escribir funciones asincrónicas en JavaScript. Lee nuestro tutorial Comprender el bucle de eventos, las devoluciones de llamadas, las promesas y Async/Await en JavaScript para aprender los conceptos básicos.
Paso 1: Configuración del directorio del proyecto
En este paso, creará el directorio para la aplicación de nodo y la instalará node-postgres
con npm
. Este directorio es donde trabajará en la creación de su base de datos PostgreSQL y los archivos de configuración para interactuar.
Crea el directorio para tu proyecto usando el mkdir
comando:
- mkdir node_pg_app
Navegue hasta el directorio recién creado usando el cd
comando:
- cd node_pg_app
Inicialice el directorio con un package.json
archivo usando el npm init
comando:
- npm init -y
La -y
bandera crea un package.json
archivo predeterminado.
A continuación, instale el node-postgres
módulo con npm install
:
- npm install pg
Ya ha configurado el directorio para su proyecto y lo ha instalado node-postgres
como dependencia. Ahora está listo para crear un usuario y una base de datos en Postgres.
Paso 2: Creación de un usuario de base de datos y una base de datos en PostgreSQL
En este paso, creará un usuario de base de datos y la base de datos para su aplicación.
Cuando instala Postgres en Ubuntu por primera vez, se crea un usuario postgres
en su sistema, un usuario de base de datos llamado postgres
y una base de datos postgres
. El usuario postgres
le permite abrir una sesión de PostgreSQL donde puede realizar tareas administrativas, como crear usuarios y bases de datos.
PostgreSQL utiliza un esquema de conexión de autenticación de identidad que permite a un usuario de Ubuntu iniciar sesión en el shell de Postgres siempre que el nombre de usuario sea similar al usuario de Postgres. Dado que ya tiene un postgres
usuario en Ubuntu y un postgres
usuario en PostgreSQL creado en su nombre, podrá iniciar sesión en el shell de Postgres.
Para iniciar sesión, cambie el usuario de Ubuntu a postgres
with sudo
e inicie sesión en el shell de Postgres usando el psql
comando:
- sudo -u postgres psql
Los argumentos del comando representan:
-u
: una bandera que cambia el usuario al usuario indicado en Ubuntu. Pasarpostgres
usuario como argumento cambiará el usuario en Ubuntu apostgres
.psql
:un programa de terminal interactivo de Postgres donde puedes ingresar comandos SQL para crear bases de datos, roles, tablas y mucho más.
Una vez que inicie sesión en el shell de Postgres, su terminal se verá así:
postgres
es el nombre de la base de datos con la que interactuarás y #
denota que has iniciado sesión como superusuario.
Para la aplicación Node, creará un usuario y una base de datos separados que la aplicación utilizará para conectarse a Postgres.
Para ello, crea un nuevo rol con una contraseña segura:
- CREATE USER fish_user WITH PASSWORD 'password';
En Postgres, un rol puede considerarse como un usuario o un grupo, según el caso de uso. En este tutorial, lo usarás como usuario.
A continuación, crea una base de datos y asigna la propiedad al usuario que creaste:
- CREATE DATABASE fish OWNER fish_user;
Al asignar la propiedad de la base de datos, fish_user
se otorgan privilegios de rol para crear, eliminar e insertar datos en las tablas de la fish
base de datos.
Con el usuario y la base de datos creados, salga del shell interactivo de Postgres:
- q
Para iniciar sesión en el shell de Postgres como fish_user
, debe crear un usuario en Ubuntu con un nombre similar al usuario de Postgres que creó.
Crea un usuario con el adduser
comando:
- sudo adduser fish_user
Ya ha creado un usuario en Ubuntu, un usuario de PostgreSQL y una base de datos para su aplicación Node. A continuación, iniciará sesión en el shell interactivo de PostgreSQL mediante fish_user
y creará una tabla.
Paso 3: Abrir un shell de Postgres con un rol y crear una tabla
En esta sección, abrirás el shell de Postgres con el usuario que creaste en la sección anterior en Ubuntu. Una vez que inicies sesión en el shell, crearás una tabla para la aplicación Node.js.
Para abrir el shell como fish_user
, ingrese el siguiente comando:
- sudo -u fish_user psql -d fish
sudo -u fish_user
Cambia tu usuario de Ubuntu a fish_user
y luego ejecuta el psql
comando como ese usuario. La -d
bandera especifica la base de datos a la que quieres conectarte, que es fish
en este caso. Si no especificas la base de datos, psql
intentará conectarse a fish_user
la base de datos predeterminada, que no encontrará y arrojará un error.
Una vez que haya iniciado sesión en el psql
shell, el indicador de shell se verá así:
fish
Indica que ahora está conectado a la fish
base de datos.
Puede verificar la conexión usando el conninfo
comando:
- conninfo
Recibirá un resultado similar al siguiente:
OutputYou are connected to database "fish" as user "fish_user" via socket in "/var/run/postgresql" at port "5432".
La salida confirma que efectivamente has iniciado sesión como fish_user
y que estás conectado a la fish
base de datos.
A continuación, creará una tabla que contendrá los datos que insertará su aplicación.
La tabla que creará mantendrá un registro de los nombres de los tiburones y sus colores. Cuando se complete con datos, tendrá el siguiente aspecto:
identificación | nombre | color |
---|---|---|
1 | Sammy | azul |
2 | José | verde azulado |
Usando el comando SQL create table
, crea una tabla:
- CREATE TABLE shark(
- id SERIAL PRIMARY KEY,
- name VARCHAR(50) NOT NULL,
- color VARCHAR(50) NOT NULL);
El CREATE TABLE shark
comando crea una tabla con 3 columnas:
-
id
: un campo de incremento automático y una clave principal para la tabla. Cada vez que inserte una fila, Postgres incrementará y completará elid
valor. -
name
ycolor
: campos que pueden almacenar 50 caracteres.NOT NULL
es una restricción que evita que los campos estén vacíos.
Verifique si la tabla ha sido creada con el propietario correcto:
- dt
El dt
comando enumera todas las tablas de la base de datos.
Al ejecutar el comando, el resultado será similar al siguiente:
List of relations Schema | Name | Type | Owner--------+-------+-------+----------- public | shark | table | fish_user(1 row)
La salida confirma que el fish_user
propietario de la shark
tabla.
Ahora salga del shell de Postgres:
- q
Te llevará de nuevo al directorio del proyecto.
Con la tabla creada, utilizará el node-postgres
módulo para conectarse a Postgres.
Paso 4: Conexión a una base de datos Postgres
En este paso, usarás node-postgres
para conectar tu aplicación Node.js a la base de datos PostgreSQL. Para ello, usarás node-postgres
para crear un grupo de conexiones . Un grupo de conexiones funciona como un caché para las conexiones de la base de datos, lo que permite que tu aplicación reutilice las conexiones para todas las solicitudes de la base de datos. Esto puede acelerar tu aplicación y ahorrar recursos de tu servidor.
Crea y abre un db.js
archivo en tu editor preferido. En este tutorial, usarás nano
, un editor de texto de terminal:
- nano db.js
En su db.js
archivo, requiera en el node-postgres
módulo y use la asignación de desestructuración para extraer una clase Pool
de node-postgres
.
nodo_pg_app/db.js
const { Pool } = require('pg')
A continuación, cree una Pool
instancia para crear un grupo de conexiones:
nodo_pg_app/db.js
const { Pool} = require('pg')const pool = new Pool({ user: 'fish_user', database: 'fish', password: 'password', port: 5432, host: 'localhost',})
Cuando crea la Pool
instancia, pasa un objeto de configuración como argumento. Este objeto contiene los detalles node-postgres
que se utilizarán para establecer una conexión con Postgres.
El objeto define las siguientes propiedades:
user
:el usuario que creó en Postgres.database
:el nombre de la base de datos que creó en Postgres.password
:la contraseña del usuariofish_user
.port
:el puerto en el que Postgres está escuchando.5432
es el puerto predeterminado.host
: el servidor Postgresnode-postgres
al que desea conectarse. Al pasarlo,localhost
se conectaránode-postgres
al servidor Postgres instalado en su sistema. Si su servidor Postgres residiera en otra gota, su nombrehost
se vería así:host: server_ip_address
.
Nota: En producción, se recomienda mantener los valores de configuración en un archivo diferente, como el .env
archivo . Luego, este archivo se agrega al .gitignore
archivo si se usa Git para evitar rastrearlo con el control de versiones. La ventaja es que oculta información confidencial, como su password
, user
y database
de los atacantes.
Una vez que creas la instancia, se establece la conexión con la base de datos y el Pool
objeto se almacena en la pool
variable. Para usar esto en cualquier parte de tu aplicación, tendrás que exportarlo. En tu db.js
archivo, requiere y define una instancia del Pool
objeto, y establece sus propiedades y valores:
nodo_pg_app/db.js
const { Pool } = require("pg");const pool = new Pool({ user: "fish_user", database: "fish", password: "password", port: 5432, host: "localhost",});module.exports = { pool };
Guarde el archivo y salga nano
presionando CTRL+X
. Ingrese y
para guardar los cambios y confirme el nombre del archivo presionando la tecla ENTER
o RETURN
en Mac.
Ahora que ha conectado su aplicación a Postgres, utilizará esta conexión para insertar datos en Postgres.
Paso 5: inserción de datos en la base de datos de Postgres
En este paso, creará un programa que agregue datos a la base de datos PostgreSQL mediante el grupo de conexiones que creó en el db.js
archivo. Para garantizar que el programa inserte datos diferentes cada vez que se ejecuta, le dará la funcionalidad de aceptar argumentos de línea de comandos. Al ejecutar el programa, le pasará el nombre y el color del tiburón.
Crea y abre insertData.js
un archivo en tu editor:
- nano insertData.js
En su insertData.js
archivo, agregue el siguiente código para que el script procese los argumentos de la línea de comandos:
nodo_pg_app/insertData.js
const { pool } = require("./db");async function insertData() { const [name, color] = process.argv.slice(2); console.log(name, color);}insertData();
En primer lugar, se requiere el pool
objeto del db.js
archivo. Esto permite que el programa utilice la conexión a la base de datos para realizar consultas a la base de datos.
A continuación, declara la insertData()
función como función asincrónica con la async
palabra clave. Esto te permite usar la await
palabra clave para hacer que las solicitudes de base de datos sean asincrónicas.
Dentro de la insertData()
función, se utiliza el process
módulo para acceder a los argumentos de la línea de comandos . El process.argv
método Node.js devuelve todos los argumentos en una matriz, incluidos los argumentos node
y insertData.js
.
Por ejemplo, cuando ejecuta el script en la terminal con node insertData.js sammy blue
, el process.argv
método devolverá una matriz: ['node', 'insertData.js', 'sammy', 'blue']
(la matriz ha sido editada para abreviar).
Para omitir los dos primeros elementos node
y insertData.js
, se añade slice()
el método de JavaScript al process.argv
método. Esto devuelve elementos a partir del índice 2 en adelante. Estos argumentos se desestructuran en variables name
y .color
Guarde el archivo y salga nano
con CTRL+X
. Ejecute el archivo con node
y pásele los argumentos sammy
, y blue
:
- node insertData.js sammy blue
Después de ejecutar el comando, verá el siguiente resultado:
Outputsammy blue
La función ahora puede acceder a name
y shark color
desde los argumentos de la línea de comandos. A continuación, modificará la insertData()
función para insertar datos en la shark
tabla.
Abra insertData.js
nuevamente el archivo en su editor de texto y agregue el código resaltado:
nodo_pg_app/insertData.js
const { pool } = require("./db");async function insertData() { const [name, color] = process.argv.slice(2); const res = await pool.query( "INSERT INTO shark (name, color) VALUES ($1, $2)", [name, color] ); console.log(`Added a shark with the name ${name}`);}insertData();
Ahora, la insertData()
función define el name
y color
del tiburón. A continuación, espera el pool.query
método from node-postgres
que toma una sentencia SQL INSERT INTO shark (name, color) ...
como primer argumento. La sentencia SQL inserta un registro en la shark
tabla. Utiliza lo que se llama una consulta parametrizada . $1
, y $2
corresponde a las variables name
and color
en la matriz proporcionada en el pool.query()
método como segundo argumento: [name, color]
. Cuando Postgres está ejecutando la sentencia, las variables se sustituyen para proteger de forma segura su aplicación de la inyección SQL . Después de que se ejecuta la consulta, la función registra un mensaje de éxito utilizando console.log()
.
Antes de ejecutar el script, envuelva el código dentro de insertData()
la función en un try...catch
bloque para manejar los errores de tiempo de ejecución:
nodo_pg_app/insertData.js
const { pool } = require("./db");async function insertData() { const [name, color] = process.argv.slice(2); try { const res = await pool.query( "INSERT INTO shark (name, color) VALUES ($1, $2)", [name, color] ); console.log(`Added a shark with the name ${name}`); } catch (error) { console.error(error) }}insertData()
Cuando se ejecuta la función, try
se ejecuta el código dentro del bloque. Si tiene éxito, la función omitirá el catch
bloque y saldrá. Sin embargo, si se produce un error dentro del try
bloque, catch
este se ejecutará y registrará el error en la consola.
Su programa ahora puede tomar argumentos de la línea de comandos y usarlos para insertar un registro en la shark
tabla.
Guarde y salga del editor de texto. Ejecute el insertData.js
archivo con sammy
y blue
como argumentos de línea de comandos:
- node insertData.js sammy blue
Recibirás el siguiente resultado:
OutputAdded a shark with the name sammy
Al ejecutar el comando inserta un registro en la tabla shark con el nombre sammy
y el color blue
.
A continuación, ejecute el archivo nuevamente con jose
y teal
como argumentos de línea de comando:
- node insertData.js jose teal
El resultado será similar al siguiente:
OutputAdded a shark with the name jose
Esto confirma que insertó otro registro en la shark
tabla con el nombre jose
y el color teal
.
Ya has insertado dos registros en la shark
tabla. En el siguiente paso, recuperarás los datos de la base de datos.
Paso 6: Recuperación de datos de la base de datos Postgres
En este paso, recuperará todos los registros de la shark
tabla usando node-postgres
y los registrará en la consola.
Crea y abre un archivo retrieveData.js
en tu editor favorito:
- nano retrieveData.js
En su retrieveData.js
, agregue el siguiente código para recuperar datos de la base de datos:
node_pg_app/retrieveData.js
const { pool } = require("./db");async function retrieveData() { try { const res = await pool.query("SELECT * FROM shark"); console.log(res.rows); } catch (error) { console.error(error); }}retrieveData()
La retrieveData()
función lee todas las filas de la shark
tabla y las registra en la consola. Dentro del try
bloque de funciones, se invoca el pool.query()
método from node-postgres
con una sentencia SQL como argumento. La sentencia SQL SELECT * FROM shark
recupera todos los registros de la shark
tabla. Una vez recuperados, la console.log()
sentencia registra las filas.
Si se produce un error, la ejecución saltará al catch
bloque y registrará el error. En la última línea, invoca la retrieveData()
función.
A continuación, guarde y cierre el editor. Ejecute el retrieveData.js
archivo:
- node retrieveData.js
Verá un resultado similar a este:
Output[ { id: 1, name: 'sammy', color: 'blue' }, { id: 2, name: 'jose', color: 'teal' }]
node-postgres
Devuelve las filas de la tabla en un objeto tipo JSON. Estos objetos se almacenan en una matriz.
Ahora puedes recuperar datos de la base de datos. Ahora modificarás los datos de la tabla usando node-postgres
.
Paso 7: Modificación de datos en la base de datos Postgres
En este paso, utilizará node-postgres
la función para modificar datos en la base de datos de Postgres. Esto le permitirá cambiar los datos en cualquiera de los shark
registros de la tabla.
Creará un script que tome dos argumentos de línea de comandos: id
y name
. Utilizará el id
valor para seleccionar el registro que desea en la tabla. El name
argumento será el nuevo valor para el registro cuyo nombre desea cambiar.
Crea y abre el modifyData.js
archivo:
- nano modifyData.js
En su modifyData.js
archivo, agregue el siguiente código para modificar un registro en la shark
tabla:
node_pg_app/modificandoData.js
const { pool } = require("./db");async function modifyData() { const [id, name] = process.argv.slice(2); try { const res = await pool.query("UPDATE shark SET name = $1 WHERE id = $2", [ name, id, ]); console.log(`Updated the shark name to ${name}`); } catch (error) { console.error(error); }}modifyData();
Primero, necesitas el pool
objeto del db.js
archivo en tu modifyData.js
archivo.
A continuación, se define una función asincrónica modifyData()
para modificar un registro en Postgres. Dentro de la función, se definen dos variables id
y, name
a partir de los argumentos de la línea de comandos, se utiliza la asignación de desestructuración.
Dentro del try
bloque, se invoca el pool.query
método from node-postgres
pasándole una sentencia SQL como primer argumento. En la UPDATE
sentencia SQL, la WHERE
cláusula selecciona el registro que coincide con el id
valor. Una vez seleccionado, SET name = $1
cambia el valor en el campo de nombre por el nuevo valor.
A continuación, console.log
se registra un mensaje que se ejecuta una vez que se ha cambiado el nombre del registro. Por último, se llama a la modifyData()
función en la última línea.
Guarde y salga del archivo con CTRL+X
. Ejecute el modifyData.js
archivo con 2
y san
como argumentos:
- node modifyData.js 2 san
Recibirá el siguiente resultado:
OutputUpdated the shark name to san
Para confirmar que el nombre del registro ha cambiado de jose
a san
, ejecute el retrieveData.js
archivo:
- node retrieveData.js
Obtendrá un resultado similar al siguiente:
Outputoutput[ { id: 1, name: 'sammy', color: 'blue' }, { id: 2, name: 'san', color: 'teal' }]
Ahora deberías ver que el registro con la id 2
ahora tiene un nuevo nombre san
que reemplaza a jose
.
Una vez hecho esto, ya has actualizado con éxito un registro en la base de datos usando node-postgres
.
Conclusión
En este tutorial, utilizó node-postgres
la conexión y la consulta de una base de datos de Postgres. Comenzó creando un usuario y una base de datos en Postgres. Luego creó una tabla, conectó su aplicación a Postgres mediante node-postgres
, e insertó, recuperó y modificó datos en Postgres mediante el node-postgres
módulo.
Para obtener más información sobre node-postgres
, visita su documentación . Para mejorar tus habilidades con Node.js, puedes explorar la serie Cómo codificar en Node.js .
Deja una respuesta