Segundos pasos en Node.js (express, produccion)

En este articulo veremos como crear el backend con express.

Esta es la parte 2, parte 1

1. Instalar express

Instalamos express con: npm i express

 

2. Usar express

importaremos express a nuestro nuevo archivo y la base de datos. (Usaremos la misma de la parte anterior) y crearemos una aplicación:

 
const express = require("express"); // Usar la libreria de express
const app = express(); // Crea o retorna una aplicacion de express
const {DB} = require("./Base datos/db.js");
 

Con esto ya podemos empezar a hacer cositas ☺

 

3. Crear el servidor

Es mas fácil crearlo, solo tenemos que crear el puerto, asi:


const port = process.env.PORT || 3030;
app.listen(port, () => {
    console.log(`Servidor activo por express en http://localhost:${port}`);
});
 

Ya tendríamos el servidor activo.

 El uso del servidor es igual a la parte anterior.

 

4. Rutas

Es para mejorar la depuración y mejorar la escritura de urls, ya que sin esto estaríamos, por ejemplo, por cada operación http tendríamos que reescribir la url, pero ya no.

Creamos una carpeta de rutas.

Luego en el archivo origen, traeremos el archivo y creamos la ruta reusable:

 
const routeBuscar = require("./routers/buscar.js");
app.use("/api/buscar", routeBuscar);
 


 5. Operaciones HTTP

Es similar a lo visto, solo hay pequeños cambios

5.1 GET

En el siguiente ejemplo, traeremos toda la base de datos.

 
app.get("/api", (req, res) => {
    res.send(DB);
});
 

 Como ven, usamos app con get. Luego se usa la url y una función de flecha la cual usa req, res. 

Y en este caso usamos res.send para enviar algo.

 

6. Parámetros de consulta

 Algo para ver antes de seguir con el HTTP, son los parámetros de consulta, es informacion que se envía a través de la url (informacion publica, no debe ser privada porque se vería).

Un ejemplo:

 
app.get("/api/nivel/:comida/:nivel", (req, res) => {
    const comida = req.params.comida;
    const nivel = req.params.nivel;
   
    let resultado = DB[comida].filter((obj) => obj.nivel == nivel);

    if(!resultado) {
        return res.status(404).send("No existe ese NIVEL");
    }

    res.send(resultado);
});
 

En el ejemplo, para determinar los parámetros de consulta, los identificaremos en la url con dos puntos. Así como esta :comida :nivel.

Para poder obtener esta informacion usamos una variable y la obtenemos de req.params.variable.

Luego en el ejemplo, se hace un filtrado para obtener los elementos que cumplan con el tipo de comida y de nivel.  


5.2 POST

Primero veremos un ejemplo: 


const routeBuscar = express.Router();
routeBuscar.use(express.json()); // Middleware

// Metodo POST
routeBuscar.post("/:comida", (req, res) => {
    let nuevaComida = req.body;
    const comida = req.params.comida;

    if(nuevaComida !== null) {
        DB[comida].push(nuevaComida);
        console.log(`Se agrego nuevo ${comida}`);

        res.status(200).send(DB[comida]);
    } else {
        res.status(404).send("Esta vacio el JSON");
    }
});

Primero. Vemos un caso de uso las rutas. Entonces como ya se creo, la obtendremos de express.Router()

El middleware, se vera mas adelante. 

Ahora si el post. Usamos con la ruta, el proceso HTTP, y la url.

Inciso: el metodo POST es para crear. Para ello con anterioridad haremos una prueba (visto en el inciso de la parte 1):

###
POST http://localhost:9000/api/agregar/frutas HTTP/1.1
Content-Type: application/json

{
    "id": 4,
    "titulo": "🍇",
    "detalle": "Uvas",
    "nivel": "Alto",
    "valor": 850
}
 

Vemos que estamos enviando un json, un objeto para ser agregado.

Esta informacion es la que obtenemos en la variable nuevacomida = req.body

Obtenemos el parámetro de consulta de :comida...

El resto del código, se verifica que no exista y entonces se crea un nuevo objeto.

 

5.3 PUT

El ejemplo para actualizar:

// Metodo PUT
routeBuscar.put("/:comida/:id", (req, res) => {
    const comida = req.params.comida;
    const id = req.params.id;

    let comidaActualizada = req.body;
    const indice = DB[comida].findIndex(obj => obj.id == id);

    if(indice >= 0) {
        DB[comida][indice] = comidaActualizada;
        console.log(`Se actualizo en ${comida} | ${id}`);

        res.status(200).send(DB[comida]);
    } else {
        res.status(404).send("No existe el objeto");
    }

});
 

Lo mismo: usamos la ruta, usamos put, la url...

Obtenemos los parámetros de consulta. Y lo enviado. 

El usuario envía:

###
PUT http://localhost:9000/api/agregar/verduras/1 HTTP/1.1
Content-Type: application/json

{
    "id": 1,
    "titulo": "🥑",
    "detalle": "H20 K té",
    "nivel": "Re-Bajo",
    "valor": 1
}
 

Se actualiza el aguacate...

El resto del código, es buscar si existe el objeto, actualizarlo.

 

5.3 PATCH

Primero el ejemplo:

 
// Metodo PATCH
routeBuscar.patch("/:comida/:id", (req, res) => {
    const comida = req.params.comida;
    const id = req.params.id;

    let comidaActualizada = req.body;
    const indice = DB[comida].findIndex(obj => obj.id == id);

    if(indice >= 0) {
        Object.assign(DB[comida][indice], comidaActualizada); // Este metodo actualiza un objeto solamente en los campos cambiados
        console.log(`Se actualizo en ${comida} | ${id}`);

        res.status(200).send(DB[comida]);
    } else {
        res.status(404).send("No existe el objeto");
    }

   
});
 

Repetimos... Usamos la ruta, el patch, la url...

Obtenemos los parametros y lo enviado por el usuario.

Lo que se envía:

###
PATCH http://localhost:9000/api/agregar/frutas/300 HTTP/1.1
Content-Type: application/json

{
    "titulo": "🍌🍌🍌",
    "valor": 5050
}
 


En el ejemplo, como es un patch, es un actualización parcial, entonces actualizamos los campos diferentes.


5.4 DELETE

El ejemplo... Otra vez...

 
// Metodo DELETE
routeBuscar.delete("/:comida/:id", (req, res) => {
    const comida = req.params.comida;
    const id = req.params.id;

    const indice = DB[comida].findIndex(obj => obj.id == id);

    if(indice >= 0) {
        DB[comida].splice(indice, 1);
        console.log(`Se elimino en ${comida} | ${id}`);

        res.status(200).send(DB[comida]);
    } else {
        res.status(404).send("No existe el objeto");
    }
   
});
 

Repetimos (haber si no se les olvida 🤣).

Usamos la ruta, el delete, la url.

Obtenemos los parámetros. 

Lo solicitado por el usuario:


DELETE http://localhost:9000/api/agregar/verduras/2 HTTP/1.1
 

El resto del código, verifica que si exista para ser borrado.


7. Middleware

Usamos con anterioridad:

routeBuscar.use(express.json()); // Middleware

Este elemento, permite leer JSON. Y los middleware se ejecutan después de recibir una solicitud. Y antes de enviar una respuesta.

 

 

Conclusión

Express facilita la escritura del código, y el desarrollo es mas fácil. Habra una parte 3 donde usaremos la base de datos de mongoDB.