Cree su propia API CRUD en Express y MySQL: primera parte

Hola a todos. En previsión del inicio del curso "Fullstack JavaScript Developer" , queremos compartir un poco de material escrito por nuestro escritor independiente.



Express es uno de los frameworks web más populares que admite enrutamiento, pesos medios y un sistema de plantillas. Hacer un back-end en Node.js sin Express en 2020 es una actividad bastante extraña, porque Express es un marco de facto para construir una aplicación web en Node.js.
Hoy intentaremos crear una API CRUD simple usando la base de datos MySQL. Un lector experimentado de Node.js preguntará, ¿dónde está MongoDB? usaremos MySQL. Crearemos una API para una aplicación simple de Todo, en caso de que alguien quiera adjuntarlo a su tarea (y ni siquiera importa si fue escrito con React o no), adjunte un poco y juegue con él.


"Arquitectura" y la esencia de nuestra aplicación



En nuestra aplicación será posible crear, recibir, actualizar y eliminar Todo. En general, tendremos un conjunto mínimo de funciones CRUD (crear, eliminar, actualizar lectura).

Al final, combinaremos la aplicación con la aplicación en React y probaremos todo.

Primero, daré la estructura de los archivos de la aplicación:



A continuación, daré una tabla de acciones y métodos que están en nuestra aplicación:

MétodosUrlComportamiento
Obtener/ ofertasobteniendo todos los casos
Obtener/ ofertas / 2Obteniendo identificación con el número 2
Enviar/ ofertasagregando un nuevo caso
Poner/ ofertas / 3Actualizar usuario con id = 3
ELIMINAR/ ofertas / 3eliminar usuario con id = 3
ELIMINAR/ ofertaseliminar a todos los usuarios

Crear su aplicación Node.js

Vaya a su directorio favorito, inicie la terminal y cree su aplicación. Por cierto, es probable que quede claro por el título que Node.js ya debería estar instalado. Si aún no lo ha hecho, entonces esto simplemente no se puede descargar desde el enlace desde aquí.

    $ mkdir CRUD_API
    $ cd CRUD_API

A continuación, debe inicializar nuestra aplicación usando npm init . Porque nuestra aplicación es más de prueba y capacitación, usaré un comando que completará todos los datos predeterminados para no perder tiempo en pequeños detalles:

 npm init -y
 

Si es así, con las manos en la mano package.jsonpuede cambiar los datos a los que necesita: el repositorio de github, etiquetas, autor, etc.

Luego necesitamos poner todos los paquetes necesarios para que la aplicación funcione:

  npm i express mysql body-parser --save


Si va a enviar su desarrollo a github más tarde, debe crear un archivo oculto .gitignorepara no arrastrar los nodos_módulos más pesados y deshonrarse . Nosotros escribimos:

    touch .gitignore 
    code .gitignore 

Ingresamos allí node_modules, más adelante en este archivo puede ingresar los nombres de carpetas y archivos que desea ver más adelante en el servidor remoto.

Configuración Express básica


En la carpeta raíz del proyecto, cree un archivo server.js:

    const express = require("express");
    const bodyParser = require("body-parser");
    
    const app = express();
    
    //     json
    app.use(bodyParser.json());
    
    //    : application/x-www-form-urlencoded
    app.use(bodyParser.urlencoded({ extended: true }));
    
    //   response - request
    app.get("/", (req, res) => {
      res.json({ message: "    " });
    });
    
    //  ,   
    app.listen(3001, () => {
      console.log("   3001 ");
    });

Ahora podemos iniciar el servidor con:

node server.js

Necesitamos Express para crear nuestra API, y el paquete body-parser nos ayuda a analizar la solicitud y crear req.bodyuna que sea útil para el enrutamiento.

Ahora nuestro servidor puede hacer lo siguiente:

  • Cree una aplicación Express que haga que body-parser sea una midlever usando app.use ()
  • tenemos un simple get, solo para probar la aplicación
  • Escuche el puerto 3001 para todos los cambios entrantes

Inicialmente, nuestra aplicación funciona, luego puede hacer la base de datos.

Crea tu tabla de datos MySQL

Realmente espero que el lector de este artículo no tenga problemas para descargar e instalar MySQL y MySQLWorkBranch por su cuenta. Luego, usted mismo crea un esquema (DB) con el nombre que más le guste (en mi caso, TODO), y luego seleccione la solicitud de rayo y copie / escriba el siguiente comando:

    CREATE TABLE IF NOT EXISTS `todo` (
        id int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
        text varchar(255) NOT NULL
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

En nuestra base de datos, todo estará al mínimo: solo la identificación y el texto del caso en sí. Sin embargo, para agregar otra columna en la que, por ejemplo, se pueda describir la urgencia de su caso, espero que no cause problemas.

Configuración y conexión con nuestra base de datos

Establezcamos y configuremos la conexión a la base de datos. Crearemos una nueva carpeta de aplicaciones directamente en nuestra carpeta raíz, y allí crearemos un archivo db.config.jsen la carpeta config, con aproximadamente el mismo contenido, que depende de su configuración en MySQLWorkBranch. En mi caso, el archivo se verá así:

  module.exports = {
    HOST: "localhost",
    USER: "pavel",
    PASSWORD: "",
    DB: "TODO"
  };

Después de eso, cree una carpeta para describir nuestros modelos de aplicación / modo , en el que luego crearemos un modelo:

  const mysql = require("mysql");
  const dbConfig = require("../config/db.config.js");
  
  //      
  const connection = mysql.createConnection({
    host: dbConfig.HOST,
    user: dbConfig.USER,
    password: dbConfig.PASSWORD,
    database: dbConfig.DB
  });
  
  //      
  connection.connect(err => {
    if (err) throw error;
    console.log("    ");
  });

  module.exports = connection;
   //  

Crear modelo

En la carpeta model, creamos un archivo llamado deal.model.js. Si tiene una pregunta, qué es un modelo en general, debe leer un artículo como este y familiarizarse con el patrón de diseño MVC. Voy a crear un constructor para un objeto Deal, y usaré la conexión para las siguientes funciones CRUD:

  • creación de un nuevo negocio
  • encontrar caso por id
  • obteniendo todos los casos
  • capacidad de actualizar nuestro caso por id
  • Eliminar un caso por id
  • eliminación completa de todos los casos

Total, tenemos que hacer lo siguiente:

  //   
  const Deal = function(deal) {
    this.text = deal.text;
  };
  //    ,        CRUD,      :
  Deal.create = (newDeal, result) => {
    sql.query("INSERT INTO TODO SET ?", newDeal, (err, res) => {
      //   SQL
      if (err) {
        console.log("error: ", err);
        result(err, null);
        //   ,     
        return;
      }
  
      console.log(" ", { id: res.insertId, ...newDeal });
      result(null, { id: res.insertId, ...newDeal });
    });
  };


Colocaré el resto del código en el spoiler, porque no veo ninguna razón para traerlo todo, porque de hecho el patrón del código se repite allí, solo cambian los comandos y argumentos de SQL:

el resto del código
Deal.findById = (dealId, result) => {
sql.query(`SELECT * FROM TODO WHERE id = ${dealId}`, (err, res) => {
if (err) {
console.log(«error: », err);
result(err, null);
return;
}

if (res.length) {
console.log(« : », res[0]);
result(null, res[0]);
return;
}

//
result({ kind: «not_found» }, null);
});
};

Deal.getAll = result => {
sql.query(«SELECT * FROM TODO», (err, res) => {
if (err) {
console.log(«error: », err);
result(null, err);
return;
}

console.log(«deals: », res);
result(null, res);
});
};

Deal.updateById = (id, deal, result) => {
sql.query(
«UPDATE TODO SET text =? WHERE id = ?»,
[deal.text, id],
(err, res) => {
if (err) {
console.log(«error: », err);
result(null, err);
return;
}

if (res.affectedRows == 0) {
result({ kind: «not_found» }, null);
return;
}

console.log(« », { id: id, ...deal });
result(null, { id: id, ...deal });
}
);
};

Deal.remove = (id, result) => {
sql.query(«DELETE FROM TODO WHERE id = ?», id, (err, res) => {
if (err) {
console.log(«error: », err);
result(null, err);
return;
}

if (res.affectedRows == 0) {
// id
result({ kind: «not_found» }, null);
return;
}
console.log(« », id);
result(null, res);
});
};

Deal.removeAll = result => {
sql.query(«DELETE FROM TODO», (err, res) => {
if (err) {
console.log(«error: », err);
result(null, err);
return;
}

console.log(`deleted ${res.affectedRows} deals`);
result(null, res);
});
};



Eso es todo por ahora. Se acerca la siguiente parte de este artículo, en la que terminamos de escribir el reverso y comenzamos a probarlo. Y por tradición, algunos enlaces útiles:


All Articles