Blog Tinux Net

nodejs-mysql-mariadb-express

Todas las publicaciones etiquetadas nodejs-mysql-mariadb-express por Blog Tinux Net
  • Publicado en

    Para crear un CRUD (Crear, Leer, Actualizar y Eliminar) de usuarios utilizando Node.js con Express como backend y MariaDB como base de datos, siguiendo tu configuración con Apache2 y un dominio virtual hay que seguir estos pasos:

    Configuración inicial
    Primero, asegurarse de tener instalados Node.js, npm y MariaDB en el sistema. Luego, crea un nuevo proyecto e instalar las dependencias necesarias:

    mkdir crud-usuarios
    cd crud-usuarios
    npm init -y
    npm install express mysql2 body-parser
    

    Estructura del proyecto
    Crear la siguiente estructura de archivos:

    crud-usuarios/
    ├── app.js
    ├── config/
    │ └────── db.js
    └── routes/
    └────── users.js

    Configuración de la base de datos
    En el archivo config/db.js, configura la conexión a MariaDB:
    [ config/db.js ]

    const mysql = require('mysql2');
    
    const connection = mysql.createConnection({
      host: 'localhost',
      user: 'tu_usuario',
      password: 'tu_contraseña',
      database: 'tu_base_de_datos'
    });
    
    connection.connect(error => {
      if (error) throw error;
      console.log('Conexión exitosa a la base de datos.');
    });
    
    module.exports = connection;
    

    Configuración del servidor Express
    En el archivo app.js, configura el servidor Express:

    [ app.js ]

    const express = require('express');
    const bodyParser = require('body-parser');
    const usersRoutes = require('./routes/users');
    
    const app = express();
    
    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({ extended: true }));
    
    app.use('/api/users', usersRoutes);
    
    const PORT = process.env.PORT || 3000;
    app.listen(PORT, () => {
      console.log(`Servidor corriendo en el puerto ${PORT}`);
    });
    

    Implementación de las rutas CRUD
    En el archivo routes/users.js, implementa las rutas para el CRUD:
    [ routes/users.js ]

    const express = require('express');
    const router = express.Router();
    const db = require('../config/db');
    
    // Crear un usuario
    router.post('/', (req, res) => {
      const { user, username } = req.body;
      const query = 'INSERT INTO users (user, username) VALUES (?, ?)';
    
      db.query(query, [user, username], (error, results) => {
        if (error) {
          return res.status(500).json({ error: error.message });
        }
        res.status(201).json({ id: results.insertId, user, username });
      });
    });
    
    // Obtener todos los usuarios
    router.get('/', (req, res) => {
      const query = 'SELECT * FROM users';
    
      db.query(query, (error, results) => {
        if (error) {
          return res.status(500).json({ error: error.message });
        }
        res.json(results);
      });
    });
    
    // Obtener un usuario por ID
    router.get('/:id', (req, res) => {
      const query = 'SELECT * FROM users WHERE id = ?';
    
      db.query(query, [req.params.id], (error, results) => {
        if (error) {
          return res.status(500).json({ error: error.message });
        }
        if (results.length === 0) {
          return res.status(404).json({ message: 'Usuario no encontrado' });
        }
        res.json(results[0]);
      });
    });
    
    // Actualizar un usuario
    router.put('/:id', (req, res) => {
      const { user, username } = req.body;
      const query = 'UPDATE users SET user = ?, username = ? WHERE id = ?';
    
      db.query(query, [user, username, req.params.id], (error, results) => {
        if (error) {
          return res.status(500).json({ error: error.message });
        }
        if (results.affectedRows === 0) {
          return res.status(404).json({ message: 'Usuario no encontrado' });
        }
        res.json({ id: req.params.id, user, username });
      });
    });
    
    // Eliminar un usuario
    router.delete('/:id', (req, res) => {
      const query = 'DELETE FROM users WHERE id = ?';
    
      db.query(query, [req.params.id], (error, results) => {
        if (error) {
          return res.status(500).json({ error: error.message });
        }
        if (results.affectedRows === 0) {
          return res.status(404).json({ message: 'Usuario no encontrado' });
        }
        res.json({ message: 'Usuario eliminado correctamente' });
      });
    });
    
    module.exports = router;
    

    Configuración de Apache2 como proxy inverso
    Para que Apache2 funcione como proxy inverso para la aplicación Node.js, se necesita configurar un virtual host. Editar el archivo de configuración del dominio virtual:

    sudo nvim  /etc/apache2/sites-available/subdomain.dominio.net.conf
    

    Añadir la siguiente configuración:

    <VirtualHost *:80>
        ServerName subdomain.dominio.net
        ProxyPreserveHost On
        ProxyPass / http://localhost:3000/
        ProxyPassReverse / http://localhost:3000/
        ErrorLog ${APACHE_LOG_DIR}/subdomain.dominio.net-error.log
        CustomLog ${APACHE_LOG_DIR}/subdomain.dominio.net-access.log combined
    </VirtualHost>
    

    Habilitar el módulo proxy de Apache2 y reiniciar el servicio:

    sudo a2enmod proxy proxy_http
    sudo systemctl restart apache2
    

    Uso del CRUD
    Ahora puedes usar el CRUD a través de tu dominio virtual:

    • Crear un usuario: POST http://subdomain.dominio.net/api/users
    • Obtener todos los usuarios: GET http://subdomain.dominio.net/api/users
    • Obtener un usuario por ID: GET http://subdomain.dominio.net/api/users/:id
    • Actualizar un usuario: PUT http://subdomain.dominio.net/api/users/:id
    • Eliminar un usuario: DELETE http://subdomain.dominio.net/api/users/:id

    Iniciar la aplicación Node.js con:

    node app.js
    

    Este CRUD te permitirá gestionar los usuarios en tu base de datos MariaDB a través de una API RESTful, accesible desde tu dominio virtual http://subdomain.dominio.tinux.net