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鈥,鈥楯uanTeix鈥,鈥楯uan鈥)

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鈥b4free 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 鈥減latform鈥 del servicio 鈥渄b鈥 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 鈥渘ext()鈥? 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(鈥榩g鈥);

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(鈥楧B 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