Volver a la lista

Integración de Node.js y MySQL

Aprenderás a conectarte a MySQL con Node.js y a insertar y extraer datos mediante código real.

Intermedio
|
8min
|
Verificado (2026-07)
Progreso0/55 (0%)

Integración de Node.js con MySQL

Al finalizar este tema

Podrás conectar Node.js con MySQL y escribir código para ejecutar consultas CRUD.


¿Por qué usar una base de datos en Node.js?

Hasta ahora, has ingresado SQL directamente en el cliente de MySQL. Sin embargo, en los servicios web reales, el código debe ejecutar las consultas SQL de forma automática.

Cuando un usuario presiona el botón de registro → el servidor ejecuta INSERT INTO users ... → y devuelve los resultados como respuesta. Este proceso se implementa mediante código en Node.js.


Instalación de mysql2 y conexión

bash
npm install mysql2
javascript
const mysql = require('mysql2');

// Configuración de conexión
const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: 'mypassword',
  database: 'myapp'
});

// Verificar conexión
connection.connect((err) => {
  if (err) {
    console.error('Fallo en la conexión:', err.message);
    return;
  }
  console.log('Conexión a MySQL exitosa');
});

mysql2 es la biblioteca estándar para usar MySQL en Node.js. Aunque existe un paquete antiguo llamado mysql, mysql2 es más rápido y compatible con Promise.


Ejecución de consultas — CRUD

Consulta de datos (SELECT)

javascript
connection.query('SELECT * FROM users', (err, rows) => {
  if (err) {
    console.error(err);
    return;
  }
  console.log(rows);
  // [ { id: 1, name: 'Kim Hoon', email: 'hoon@example.com' }, ... ]
});

El resultado se devuelve como un array de JavaScript. Cada fila es un objeto.

Inserción de datos (INSERT)

javascript
const name = 'Park Jin';
const email = 'jin@example.com';

connection.query(
  'INSERT INTO users (name, email) VALUES (?, ?)',
  [name, email],
  (err, result) => {
    if (err) {
      console.error(err);
      return;
    }
    console.log('ID insertado:', result.insertId);
  }
);

? es un marcador de posición. Si se pasa un valor como un array, mysql2 lo asignará de forma segura.

Modificación de datos (UPDATE)

javascript
connection.query(
  'UPDATE users SET email = ? WHERE id = ?',
  ['new@example.com', 1],
  (err, result) => {
    console.log('Filas modificadas:', result.affectedRows);
  }
);

Eliminación de datos (DELETE)

javascript
connection.query(
  'DELETE FROM users WHERE id = ?',
  [3],
  (err, result) => {
    console.log('Filas eliminadas:', result.affectedRows);
  }
);

Marcadores de posición (?) — ¿Por qué son importantes?

javascript
// ❌ Nunca hagas esto
const userInput = "'; DROP TABLE users; --";
connection.query(`SELECT * FROM users WHERE name = '${userInput}'`);

// ✅ Usa siempre marcadores de posición
connection.query('SELECT * FROM users WHERE name = ?', [userInput]);

Insertar la entrada del usuario directamente en una cadena SQL expone a ataques de inyección SQL. Al usar marcadores de posición (?), mysql2 escapa automáticamente los caracteres peligrosos.


Pool de conexiones — patrones prácticos

En servidores reales, en lugar de crear y cerrar una conexión por cada solicitud, se utiliza un pool de conexiones.

javascript
const pool = mysql.createPool({
  host: 'localhost',
  user: 'root',
  password: 'mypassword',
  database: 'myapp',
  waitForConnections: true,
  connectionLimit: 10
});

// Ejecutar consulta en el pool (gestión automática de conexiones)
pool.query('SELECT * FROM users WHERE id = ?', [1], (err, rows) => {
  console.log(rows);
});

El pool mantiene múltiples conexiones preestablecidas y asigna una conexión disponible cuando se recibe una consulta. Una vez finalizada la consulta, la conexión se devuelve al pool. Esto elimina el costo de crear y cerrar conexiones en cada ocasión.


Enfoque basado en Promise (async/await)

Si el patrón de callback resulta complejo, se puede utilizar el enfoque basado en Promise.

javascript
const mysql = require('mysql2/promise');

async function main() {
  const pool = mysql.createPool({
    host: 'localhost',
    user: 'root',
    password: 'mypassword',
    database: 'myapp'
  });

  const [rows] = await pool.query('SELECT * FROM users');
  console.log(rows);

  const [result] = await pool.query(
    'INSERT INTO users (name, email) VALUES (?, ?)',
    ['NuevoUsuario', 'new@example.com']
  );
  console.log('ID insertado:', result.insertId);
}

main();

Al importar mysql2/promise, todos los métodos devuelven una Promise. Se puede utilizar de forma sencilla con await.

💬 Preguntas y comentarios

0 comentarios

Puedes publicar sin iniciar sesión. Los comentarios de invitados no pueden editarse ni eliminarse después.

0/2000

Cargando...