Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Base de datos real: MySQL

14/29
Recursos

Aportes 43

Preguntas 9

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

Congiguracion para usar el Mysql Community Server
Yo lo instale a traves de el Mysql Installer for Windows para no complicarme la vida con los usuarios y contraseñas, no olviden agregar la carpeta bin de mysql al PATH.

Antes de ejecutar el servidor

  1. Iniciar sesión a través del cmd con el comando
 mysql -u tu_usuario -h localhost -p

(presionan enter y escribir la password).

  1. Otorgar privilegios flush al usuario para que no te provoque error al conectarse al servidor en Node:
ALTER USER tu_usuario IDENTIFIED WITH mysql_native_password BY 'password_de_tu_usuario';
flush privileges;

Si quieres utilizar el usuario root:

ALTER USER [email protected] IDENTIFIED WITH mysql_native_password BY 'password_root';
flush privileges;
  1. Necesitamos crear la base de datos:
 CREATE DATABASE nombe_de_la_bd;

Puedes comprobar que se creó con:

SHOW DATABASES;
  1. Colocar en el host la dirrecion 127.0.0.1 (equivalente a localhost) y agregar a la configuración el puerto, que por lo general es el 3306.
// mysql.js
...
const dbconfig = {
  host: config.mysql.host,
  port: config.mysql.port,
  user: config.mysql.user,
  password: config.mysql.password,
  database: config.mysql.database
};
...

// config.js
...
mysql: {
    host: process.env.MYSQL_HOST || "127.0.0.1",
    port: process.env.MYSQL_PORT || "3306",
    user: process.env.USER || "gsus",
    password: process.env.MYSQL_PASSWORD || "1234",
    database: process.env.MYSQL_DATABASE || "pruebamicro"
  }
...

¿Quién más siente que en mysql es más sencillo?

Para los que an tenido problemas con la base de datos recomendada les sugiero esta https://www.freemysqlhosting.net/ hacen exactamente los mismos pasos que el profesor y ya!

Para crear la función get, simplemente hacemos lo mismo, pero usando el id (de la manera que el profe explicó primero)

const get = async (table, id) => new Promise((resolve, reject) => {
  connection.query(`SELECT * FROM ${table} WHERE id = '${id}'`, (error, data) => {
    if (error) return reject(error)
    resolve(data)
  })
})

El código por si alguien lo crea desde consola.

CREATE TABLE user(
  id        VARCHAR(32),
  username  VARCHAR(32),
  `name`      VARCHAR(64)
);

INSERT INTO user (id, username, `name`) VALUES (213,'username', 'name');

Si usan SQL con terminal les dejo los comando de solo copiar y pegar.

CREATE DATABASE vyU7DCqzKX;

CREATE TABLE user(
id INT(11) NOT NULL,
username VARCHAR(22) NOT NULL,
name VARCHAR(100) NOT NULL
);

INSERT INTO user (id, username,name) VALUES (‘123’,‘JuanTeix’,‘Juan’)

El nombre de la base de datos pueden colocar la que quieran.

Para ver la estructura de la tabla
DESCRIBE user;

y para ver en terminal lo que han insertado coloquen
SELECT * FROM user;

Les recomiendo usar como base de datos db4free, ya que remotemysql se ha caido muchas veces y actualmente no esta funcionando, y freemysqlhosting es por tiempo limitado,y puede que no les alcance para terminar el curso…db4free es lento pero seguro

En la clase nos conectamos con el driver de MySQL directo. Cosa que está excelente para aprender! Excelente clase
.
Igualmente existen ORM en Node que nos facilitará el desarrollo. Acá uno bien popular para quién pueda interesar: https://sequelize.org/v5/manual/getting-started.html

Ver como consultas a la BBDD y todo funciona … que lindo…

usar Docker es mejor que instalar la aplicación directamente en windows

No podía conectarme ni en Amazon, ni en remotemysql, ni en local… hasta que cambie la librería “msql” por “mysql2”.

Creo que esta respuesta en Stack Overflow lo explica:

Si les sale el siguiente error

ER_NO_DB_ERROR: No database selected

controlen su consulta, la tendrian que tener asi

`SELECT * FROM ${dbConfig.db + "." + table}`

donde dbConfig.db tiene el nombre mi mi base de datos

Por si alguien gusta el pequeño script

CREATE TABLE user(
  id        VARCHAR(32) Primary key,
  username  VARCHAR(32),
  name      VARCHAR(64)
);

tantas buenas practicas y archivos diferentes y termina usando mysql a saco? esperaba ver algo de Sequelize en este curso…

Yo siempre agrego el puerto en la cadena de conexión, ya que en ocasiones trabajo con puertos distintos al puerto default (puerto default mysql: 3306)

const dbconf = {
host: config.mysql.host,
port: config.mysql.port,
user: config.mysql.user,
password: config.mysql.password,
database: config.mysql.database,
};

Alguien sabe las razones de por qué usando la función next como argumento en el catch dentro del user/network.js Carlos dice que los errores se gestionan automáticamente? Lo que entiendo es que el error se generó antes en el controller o store, entonces con el next le que hacemos es decirle al middleware (network), mira, sigue adelante que ya el error se gestionó y no tienes nada que esperar. ¿Estoy en lo correcto? o hay alguna otra razón que no soy capaz de ver.

Muy interesante, pero hubiera preferido usar docker.

Esta clase es oro puro, yo usé para crear la BD https://www.freemysqlhosting.net/

Si desean ocupar Docker:

La propiedad “platform” del servicio “db” es para que les funcionen a los que tienen Mac m1

version: '3'
services:
  db:
    image: mysql
    platform: linux/x86_64
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: admin
      MYSQL_USER: admin
      MYSQL_PASSWORD: admin
      MYSQL_DATABASE: prueba
    volumes:
      - ./data/DB:/var/lib/mysql
    ports:
      - 3306:3306

  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080

Realizar las queries con templates strings no es la mejor forma ya que nos expone a ataques SQL Injection. Lo mas recomendable es hacerlo de la siguiente manera:

connection.query('SELECT * FROM ? WHERE id = ?', [table, userId], function (error, results, fields) {
  if (error) throw error;
  // ...
});

Para que puedan usar las variables de entornos agregadas a un .env, deben instalar el paquete dotenv y poner este código al inicio del api/index.js

require('dotenv').config();

para los que quieran un servicio de hosting de Mysql pueden usar clever cloud https://www.clever-cloud.com/en/

Utilice elephantsql que recomiendan en el curso de curso de introducción al despliegue de aplicaciones, y segui la documentacion para conectar la base de datos

Mongo DB lo considero bastante versátil, ya con mongo atlas te regalan clusters en la nube, seria bueno una implementación con el.

Cuando intente ingresar a remotesql no me lo permitió sin embargo estoy usando elephantsql por si a alguien mas la pasa lo mismo

si no quieren usar PHPMyAdmin, Beekeeper studio podria ser una buena alternativa:
https://www.beekeeperstudio.io/

No saben lo importante que es esa simple funcion de handleCon() cuando se vayan a produccion, dure dias con ese error porque en ninguna parte mencionaban que el socket cierra la conexion de MySQL.

Alguien tuvo algún problema para crear una base de datos en remotemysql.com ?. A mi no me deja…

Excelente clase, apoyo la iniciativa de aprender a conectar node.js con distintas bases de datos.
Sin embargo considero en mi opinión que es mucho más fácil trabajar con mongo.db o con postgress

Actualmente esta la version 2, no hay diferencias?

Me encantó que no tengamos que instalarnos MySQL en la PC para poder continuar con el curso, al menos para los que usamos otras DBs como PSQL o MongoDB.
Genial herramienta Remote MySQL.

¿Si quiero utilizar node y sql para producción que hosting de mysql me recomiendan?
Igual uno que no sea muy caro.

Con las librerías de mysql es fácil hacer la conexión, me estaba imaginando algo muy complejo. npm es de lo mejor.

Alguien me podría un poco mejor como funciona la parte del método “next()”? Cómo hace next para ejecutar el middleware de errors? O.o

alguien sabe porque no me aparece el boton de crear base de datos

const { Pool } = require(‘pg’);

const {config} = require(’…/config/env’);

let dbconfig = new Pool({
host: config.dbHost,
user: config.dbUser,
password: config.dbPassword,
database: config.dbName
});

function handleCon(){
dbconfig.connect((err) => {
if (err) {
console.error(’[ERROR]’, err)
setTimeout(handleCon, 2000)
} else {
console.log(‘DB Connected’);
}
});
}

handleCon();

Puedo hacerlo con Postgresql? Que libreria me recomiendan para hacerlo, gracias

Me lanza errores de PROTOCOL_CONNECTION_LOST constantemente, sera por conexión lenta a internet?

solo dire un comentario este tipo sabe lo que dice, este curso vale 300% la pena

¿Entonces este servicio no es recomendado usarlo en producción? hubiera sido bueno implementar PostgreSQL (así como hay curso de MongoDB para complementar y se puede usar en producción, en este de base de datos relacional hubiera sido genial pero bueno)

Como utilizar Postgres con Docker

Para los que quieran usar postgres, yo lo hice así:

  1. Configurar el archivo de docker-compose para definir los servicios.
    El archivo de ejemplo también contiene un servicio para la administración
    del servidor Postgres vía web a través de pgAdmin 4, al que se puede acceder
    a través de h t t p : / / localhost : 5050
    Las credenciales de acceso son:
    correo electrónico: [email protected]
    contraseña: postgres
version: "3.7"
services:
  postgres:
    image: postgres:11
    volumes:
      - type: volume
        source: platzi_node_practico_postgres_data
        target: /var/lib/postgresql/data
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_PASSWORD=postgres
  pgadmin:
    image: dpage/pgadmin4
    depends_on:
      - postgres
    environment:
      PGADMIN_DEFAULT_EMAIL: [email protected]
      PGADMIN_DEFAULT_PASSWORD: postgres
    ports:
      - "5050:80"
volumes:
  platzi_node_practico_postgres_data:
  1. Configurar las variables de entorno generales en config.js
module.exports = {
  api: {
    port: process.env.API_PORT || 3000
  },
  jwt: {
    secret: process.env.JWT_SECRET || 'Texto super secreto!'
  },
  postgres: {
    host: process.env.POSTGRES_HOST || 'localhost',
    user: process.env.POSTGRES_USER || 'postgres',
    password: process.env.POSTGRES_PASSWORD || 'postgres',
    database: process.env.POSTGRES_DB || 'postgres',
    port: process.env.POSTGRES_PORT || '5432',
    schema: process.env.POSTGRES_SCHEMA || 'public',
  }
}
  1. Instalar el driver de conexión de Postgres:
npm i express pg
  1. Crear el pool de conexión en el archivo postgres.js
    Es necesario configurar el schema (por defecto es public) porque de no hacerlo, al consultar la tabla
    user se retorna la lista de usuarios de la base de datos y no los que hemos definido en nuestra tabla
    user.
const { Pool } = require('pg');
const config = require('../config');

const SCHEMA = config.postgres.schema;

const dbconf = {
  host: config.postgres.host,
  user: config.postgres.user,
  password: config.postgres.password,
  database: config.postgres.database,
  port: config.postgres.port,
};

const pool = new Pool(dbconf);

function handleCon(){
  // Función para gestionar la conexión con la base de datos
  pool.connect((err) => {
    if (err) {
      console.error('[ERROR]', err);
      setTimeout(handleCon, 2000);
    } else {
      console.log('DB Connected');
    }
  });
}

handleCon();

function list(table) {
  return pool.query(`SELECT * FROM ${SCHEMA}.${table}`)
    .then(res => {
      // Es necesario retornar una promesa que contenga solo el resultado de la
      // consulta, de lo contrario se retornará el objeto que contiene toda la 
      // consulta, la cual está formada por los datos en la tabla y otros 
      // adicionales.
      return res.rows;
    });
}

module.exports = {
  list,
};

Fuentes