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

Índice
  1. Introducción
  • Prerrequisitos
  • Paso 1: Configuración del directorio del proyecto
  • Paso 2: Creación de un usuario de base de datos y una base de datos en PostgreSQL
  • Paso 3: Abrir un shell de Postgres con un rol y crear una tabla
  • Paso 4: Conexión a una base de datos Postgres
  • Paso 5: inserción de datos en la base de datos de Postgres
  • Paso 6: Recuperación de datos de la base de datos Postgres
  • Paso 7: Modificación de datos en la base de datos Postgres
  • Conclusión
  • 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-postgresel 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-postgresmódulo. Después, utilizará el módulo node-postgrespara 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 sudoprivilegios 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-postgrescon 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 mkdircomando:

    1. mkdir node_pg_app

    Navegue hasta el directorio recién creado usando el cdcomando:

    1. cd node_pg_app

    Inicialice el directorio con un package.jsonarchivo usando el npm initcomando:

    1. npm init -y

    La -ybandera crea un package.jsonarchivo predeterminado.

    A continuación, instale el node-postgresmódulo con npm install:

    1. npm install pg

    Ya ha configurado el directorio para su proyecto y lo ha instalado node-postgrescomo 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 postgresen su sistema, un usuario de base de datos llamado postgresy una base de datos postgres. El usuario postgresle 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 postgresusuario en Ubuntu y un postgresusuario 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 postgreswith sudoe inicie sesión en el shell de Postgres usando el psqlcomando:

    1. sudo -u postgres psql

    Los argumentos del comando representan:

    • -u: una bandera que cambia el usuario al usuario indicado en Ubuntu. Pasar postgresusuario como argumento cambiará el usuario en Ubuntu a postgres.
    • 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í:

    postgreses 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:

    1. 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:

    1. CREATE DATABASE fish OWNER fish_user;

    Al asignar la propiedad de la base de datos, fish_userse otorgan privilegios de rol para crear, eliminar e insertar datos en las tablas de la fishbase de datos.

    Con el usuario y la base de datos creados, salga del shell interactivo de Postgres:

    1. 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 addusercomando:

    1. 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_usery 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:

    1. sudo -u fish_user psql -d fish

    sudo -u fish_userCambia tu usuario de Ubuntu a fish_usery luego ejecuta el psqlcomando como ese usuario. La -dbandera especifica la base de datos a la que quieres conectarte, que es fishen este caso. Si no especificas la base de datos, psqlintentará conectarse a fish_userla base de datos predeterminada, que no encontrará y arrojará un error.

    Una vez que haya iniciado sesión en el psqlshell, el indicador de shell se verá así:

    fishIndica que ahora está conectado a la fishbase de datos.

    Puede verificar la conexión usando el conninfocomando:

    1. 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_usery que estás conectado a la fishbase 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:

    1. CREATE TABLE shark(
    2. id SERIAL PRIMARY KEY,
    3. name VARCHAR(50) NOT NULL,
    4. color VARCHAR(50) NOT NULL);

    El CREATE TABLE sharkcomando 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á el idvalor.

    • namey color: campos que pueden almacenar 50 caracteres. NOT NULLes una restricción que evita que los campos estén vacíos.

    Verifique si la tabla ha sido creada con el propietario correcto:

    1. dt

    El dtcomando 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_userpropietario de la sharktabla.

    Ahora salga del shell de Postgres:

    1. q

    Te llevará de nuevo al directorio del proyecto.

    Con la tabla creada, utilizará el node-postgresmódulo para conectarse a Postgres.

    Paso 4: Conexión a una base de datos Postgres

    En este paso, usarás node-postgrespara conectar tu aplicación Node.js a la base de datos PostgreSQL. Para ello, usarás node-postgrespara 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.jsarchivo en tu editor preferido. En este tutorial, usarás nano, un editor de texto de terminal:

    1. nano db.js

    En su db.jsarchivo, requiera en el node-postgresmódulo y use la asignación de desestructuración para extraer una clase Poolde node-postgres.

    nodo_pg_app/db.js

    const { Pool } = require('pg')

    A continuación, cree una Poolinstancia 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 Poolinstancia, pasa un objeto de configuración como argumento. Este objeto contiene los detalles node-postgresque 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 usuario fish_user.
    • port:el puerto en el que Postgres está escuchando. 5432es el puerto predeterminado.
    • host: el servidor Postgres node-postgresal que desea conectarse. Al pasarlo, localhostse conectará node-postgresal servidor Postgres instalado en su sistema. Si su servidor Postgres residiera en otra gota, su nombre hostse 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 .envarchivo . Luego, este archivo se agrega al .gitignorearchivo si se usa Git para evitar rastrearlo con el control de versiones. La ventaja es que oculta información confidencial, como su password, usery databasede los atacantes.

    Una vez que creas la instancia, se establece la conexión con la base de datos y el Poolobjeto se almacena en la poolvariable. Para usar esto en cualquier parte de tu aplicación, tendrás que exportarlo. En tu db.jsarchivo, requiere y define una instancia del Poolobjeto, 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 nanopresionando CTRL+X. Ingrese ypara guardar los cambios y confirme el nombre del archivo presionando la tecla ENTERo RETURNen 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.jsarchivo. 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.jsun archivo en tu editor:

    1. nano insertData.js

    En su insertData.jsarchivo, 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 poolobjeto del db.jsarchivo. 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 asyncpalabra clave. Esto te permite usar la awaitpalabra clave para hacer que las solicitudes de base de datos sean asincrónicas.

    Dentro de la insertData()función, se utiliza el processmódulo para acceder a los argumentos de la línea de comandos . El process.argvmétodo Node.js devuelve todos los argumentos en una matriz, incluidos los argumentos nodey insertData.js.

    Por ejemplo, cuando ejecuta el script en la terminal con node insertData.js sammy blue, el process.argvmétodo devolverá una matriz: ['node', 'insertData.js', 'sammy', 'blue'](la matriz ha sido editada para abreviar).

    Para omitir los dos primeros elementos nodey insertData.js, se añade slice()el método de JavaScript al process.argvmétodo. Esto devuelve elementos a partir del índice 2 en adelante. Estos argumentos se desestructuran en variables namey .color

    Guarde el archivo y salga nanocon CTRL+X. Ejecute el archivo con nodey pásele los argumentos sammy, y blue:

    1. node insertData.js sammy blue

    Después de ejecutar el comando, verá el siguiente resultado:

    Outputsammy blue

    La función ahora puede acceder a namey shark colordesde los argumentos de la línea de comandos. A continuación, modificará la insertData()función para insertar datos en la sharktabla.

    Abra insertData.jsnuevamente 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 namey colordel tiburón. A continuación, espera el pool.querymétodo from node-postgresque toma una sentencia SQL INSERT INTO shark (name, color) ...como primer argumento. La sentencia SQL inserta un registro en la sharktabla. Utiliza lo que se llama una consulta parametrizada . $1, y $2corresponde a las variables nameand coloren 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...catchbloque 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, tryse ejecuta el código dentro del bloque. Si tiene éxito, la función omitirá el catchbloque y saldrá. Sin embargo, si se produce un error dentro del trybloque, catcheste 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 sharktabla.

    Guarde y salga del editor de texto. Ejecute el insertData.jsarchivo con sammyy bluecomo argumentos de línea de comandos:

    1. 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 sammyy el color blue.

    A continuación, ejecute el archivo nuevamente con josey tealcomo argumentos de línea de comando:

    1. 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 sharktabla con el nombre josey el color teal.

    Ya has insertado dos registros en la sharktabla. 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 sharktabla usando node-postgresy los registrará en la consola.

    Crea y abre un archivo retrieveData.jsen tu editor favorito:

    1. 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 sharktabla y las registra en la consola. Dentro del trybloque de funciones, se invoca el pool.query()método from node-postgrescon una sentencia SQL como argumento. La sentencia SQL SELECT * FROM sharkrecupera todos los registros de la sharktabla. Una vez recuperados, la console.log()sentencia registra las filas.

    Si se produce un error, la ejecución saltará al catchbloque 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.jsarchivo:

    1. node retrieveData.js

    Verá un resultado similar a este:

    Output[  { id: 1, name: 'sammy', color: 'blue' },  { id: 2, name: 'jose', color: 'teal' }]

    node-postgresDevuelve 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-postgresla función para modificar datos en la base de datos de Postgres. Esto le permitirá cambiar los datos en cualquiera de los sharkregistros de la tabla.

    Creará un script que tome dos argumentos de línea de comandos: idy name. Utilizará el idvalor para seleccionar el registro que desea en la tabla. El nameargumento será el nuevo valor para el registro cuyo nombre desea cambiar.

    Crea y abre el modifyData.jsarchivo:

    1. nano modifyData.js

    En su modifyData.jsarchivo, agregue el siguiente código para modificar un registro en la sharktabla:

    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 poolobjeto del db.jsarchivo en tu modifyData.jsarchivo.

    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 idy, namea partir de los argumentos de la línea de comandos, se utiliza la asignación de desestructuración.

    Dentro del trybloque, se invoca el pool.querymétodo from node-postgrespasándole una sentencia SQL como primer argumento. En la UPDATEsentencia SQL, la WHEREcláusula selecciona el registro que coincide con el idvalor. Una vez seleccionado, SET name = $1 cambia el valor en el campo de nombre por el nuevo valor.

    A continuación, console.logse 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.jsarchivo con 2y sancomo argumentos:

    1. 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 josea san, ejecute el retrieveData.jsarchivo:

    1. 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 2ahora tiene un nuevo nombre sanque 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-postgresla 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-postgresmó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 .

    SUSCRÍBETE A NUESTRO BOLETÍN 
    No te pierdas de nuestro contenido ni de ninguna de nuestras guías para que puedas avanzar en los juegos que más te gustan.

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

    Subir

    Este sitio web utiliza cookies para mejorar tu experiencia mientras navegas por él. Este sitio web utiliza cookies para mejorar tu experiencia de usuario. Al continuar navegando, aceptas su uso. Mas informacion