Entornos de desarrollo

1º DAM/DAW - Curso 2026-2027

User Tools

Site Tools


apuntes:backend_frontend

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
apuntes:backend_frontend [2026/09/29 09:10] – [Ejercicios] Santiago Faciapuntes:backend_frontend [2026/10/28 22:52] (current) – [Backend: API] Santiago Faci
Line 2: Line 2:
  
 <figure> <figure>
-{{ frontendbackend.jpg }}+{{ frontendbackend.jpg?450 }}
 <caption>Frontend vs Backend (Fuente: https://ecdisis.com/que-es-frontend-y-backend/)</caption> <caption>Frontend vs Backend (Fuente: https://ecdisis.com/que-es-frontend-y-backend/)</caption>
 </figure> </figure>
Line 116: Line 116:
  
 app.get('/cities', (req, res) => { app.get('/cities', (req, res) => {
-    res.json(cities);+    return res.json(cities);
 }); });
  
 app.get('/cities/:city', (req, res) => { app.get('/cities/:city', (req, res) => {
     const city = req.params.city;     const city = req.params.city;
-    res.json(cities[city]);+    return res.json(cities[city]);
 }); });
  
Line 292: Line 292:
  
 app.get('/cities', (req, res) => { app.get('/cities', (req, res) => {
-    res.status(200).json(cities);+    return res.status(200).json(cities);
 }); });
  
 app.get('/cities/:city', (req, res) => { app.get('/cities/:city', (req, res) => {
     const city = req.params.city;     const city = req.params.city;
-    res.status(200).json(cities[city]);+    return res.status(200).json(cities[city]);
 }); });
  
Line 310: Line 310:
     };     };
  
-    res.status(201).json(cities[name]);+    return res.status(201).json(cities[name]);
 }); });
  
Line 323: Line 323:
     delete cities[name];     delete cities[name];
  
-    res.status(204).end();+    return res.status(204).end();
 }); });
  
Line 336: Line 336:
     };     };
  
-    res.status(200).json(cities[name]);+    return res.status(200).json(cities[name]);
 }); });
  
Line 345: Line 345:
 </code> </code>
  
 +==== Gestión de errores ====
 +
 +La gestión de errores es una buena práctica que consiste en implementar/desarrollar controles para todas las posibles situaciones en las que nuestro código podría fallar de forma inesperada. Por ejemplo, alguien invoca nuestra operación de ver los detalles de una pelicula y se indica un título que no existe. ¿Qué debería pasar en ese caso?
 +
 +En el ejemplo anterior, el CRUD completo, se incluye un caso de gestión de errores. Antes de eliminar una pelicula cuyo nombre se ha pasado como parámetro, se comprueba que exista. Asi, se puede notificar al consumidor (quien ha invocado la operación) que ha habido un error y no se ha podido localizar la pelicula si ésta no existe:
 +  * Se response con un código de error ''404 Not Found'' que significa que el recurso solicitado no existe (la pelicula en este caso)
 +  * Se incluye un mensaje de error que proporciona información adicional que puede ayudar a diagnosticar el error o problema (en este caso es bastante sencillo pero en determinadas ocasiones puede ser más complicado saber qué ha pasado)
 +
 +<code javascript>
 +. . .
 +if (cities[name] === undefined) {
 +    return res.status(404).json({
 +        error: 'No se ha podido encontrar la ciudad'
 +    });
 +}
 +. . .
 +</code>
 +
 +==== Validación ====
 +
 +La validación es una buena práctica que consiste en comprobar que los valores del los datos que nos envian quienes invocan nuestras operaciones son correctos y de acuerdo a lo esperado. Por ejemplo, algo invoca nuestra operación de registro de ciudades y envia un texto como valor para el campo ''population''. ¿Qué debería pasar ahi? Si no controlamos casos como este, dependiendo de la complejidad del código, el backend podría fallar y detenerse o bien podrían darse casos no esperados (como que la población de una ciudad sea un texto sin sentido).
 +
 +Casos como el comentado anteriormente pueden controlarse de esta manera:
 +
 +<code javascript>
 +. . .
 +const population = req.body.population;
 +if (typeof population !== 'number' || population <= 0) {
 +    return res.status(400).json({
 +        error: 'population debe ser un número mayor que cero'
 +    });
 +}
 +. . .
 +</code>
 ===== CRUD Backend + Frontend ===== ===== CRUD Backend + Frontend =====
  
Line 385: Line 419:
  
 app.get('/cities', (req, res) => { app.get('/cities', (req, res) => {
-    res.json(cities);+    return res.json(cities);
 }); });
  
 app.get('/cities/:city', (req, res) => { app.get('/cities/:city', (req, res) => {
     const city = req.params.city;     const city = req.params.city;
-    res.json(cities[city]);+    return res.json(cities[city]);
 }); });
  
Line 403: Line 437:
     };     };
  
-    res.status(201).end();+    return res.status(201).end();
 }); });
  
Line 586: Line 620:
     const data = await findAllCities();     const data = await findAllCities();
  
-    res.status(200).json(data);+    return res.status(200).json(data);
 }); });
  
Line 593: Line 627:
     const data = await findCity(req.params.city);     const data = await findCity(req.params.city);
  
-    res.status(200).json(data);+    return res.status(200).json(data);
 }); });
  
Line 600: Line 634:
     await registerCity(req.body.name, req.body.population, req.body.altitude);     await registerCity(req.body.name, req.body.population, req.body.altitude);
  
-    res.status(201).json({});+    return res.status(201).json({});
 }); });
  
Line 607: Line 641:
     await modifyCity(req.params.city, req.body.population, req.body.altitude);     await modifyCity(req.params.city, req.body.population, req.body.altitude);
  
-    res.status(204).json({});+    return res.status(204).json({});
 }); });
  
Line 614: Line 648:
     await removeCity(req.params.city);     await removeCity(req.params.city);
  
-    res.status(204).json({})+    return res.status(204).json({})
 }); });
  
Line 970: Line 1004:
       - El titulo y el argumento son campos obligatorios a la hora de registrar una pelicula       - El titulo y el argumento son campos obligatorios a la hora de registrar una pelicula
       - El campo sala solamente podrá ser un valor entre 1 y 9 (que son las salas que tiene el cine)       - El campo sala solamente podrá ser un valor entre 1 y 9 (que son las salas que tiene el cine)
 +  - Prepara una colección Postman que permita probar todas las operaciones desarrolladas en tu API de peliculas. No olvides preparar requests para todos los casos posibles 
 +  - ¿Qué ocurre cuando, al registrar una película, se envian campos que no existen? ¿Se debería fallar? ¿Qué debería ocurrir con esa información de más que se envía? 
 +  - ¿Te has fijado en el patrón que sigue los códigos de error que has implementado en las operaciones del backend desarrollado? ¿Siguen alguna lógica? (Pista: https://datos.codeandcoke.com/apuntes:http) 
 +  - Imagina que algo falla, de forma inesperada, cuando se está ejecutando el código del backend. ¿Qué error se debería devolver? (Pista: https://datos.codeandcoke.com/apuntes:http) 
 +  - ¿Qué debería hacer el backend si alguien está invocando las operaciones de forma abusiva? (Pista: https://datos.codeandcoke.com/apuntes:http) 
 +  - Añade lo necesario para que también se puedan realizar operaciones similares pero con actores (de los que se almacene nombre, apellidos, pais de origen y si alguna vez ganaron un Oscar) 
 +  - ¿Cómo podríamos hacer que peliculas y actores estuvieran relacionadas? La idea sería saber qué actores han actuado en una determinada película, por ejemplo
 ====== Proyectos de ejemplo ====== ====== Proyectos de ejemplo ======
  
apuntes/backend_frontend.1790673005.txt.gz · Last modified: by Santiago Faci