Saltar al contenido

Clase 19 - Backend servidores y Nest

#ts #server #backend #nest

Resumen

Node

  • Es un entorno de ejecución para eventos asíncronos. Creado para diseñar aplicaciones escalables.

Node

  • Está compuesto de:
    • V8: JavaScript
    • libuv: asincronismo y event loop

Sincronismo vs Asincronismo

  • Sincronismo:
    • Cada instrucción espera a que la anterior se complete antes de ejecutarse.
    • Fácil de leer y seguir, pero puede bloquear el hilo con operaciones costosas.
console.log("Inicio");
console.log("Procesando...");
console.log("Fin");
  • Asincronismo:
    • Permite que el programa continúe ejecutándose mientras espera a que ciertas tareas se completen.
    • Ideal para operaciones como llamadas a servidores, lectura de archivos o temporizadores.
console.log("Inicio");
setTimeout(() => {
console.log("Tarea asincrónica completada");
}, 0);
console.log("Fin");

Event Loop

  • JavaScript se ejecuta en un solo hilo, pero el Event Loop permite operaciones no bloqueantes. Este mecanismo gestiona eficientemente múltiples tareas.
  • Event Loop
  • Conceptos:
    • Call Stack: Pila LIFO Last In First Out (último en entrar, primero en salir) donde se ejecutan las funciones.
    • Web APIs: Entorno proporcionado por el navegador para manejar tareas externas (temporizadores, solicitudes, etc).
    • Callback Queue: Cola de funciones esperando ser ejecutadas una vez que la pila esté libre.
    • Event Loop: Mueve tareas desde la cola hasta la pila cuando ésta se vacía.
console.log("1");
setTimeout(() => console.log("2"), 0);
console.log("3");

Promesas

  • Una Promesa es un objeto que representa el éxito o fracaso eventual de una operación asíncrona. Estructura el código asíncrono de forma clara.
  • Estados posibles:
    • pending (pendiente)
    • fulfilled (cumplida)
    • rejected (rechazada)
const promise = new Promise((resolve, reject) => {
const success = false;
setTimeout(() => {
if (success) {
resolve("Se resolvió");
}
else {
reject("Error");
}
}, 1000);
});
promise
.then(value => console.log(value))
.catch(error => console.error(error));

Async/Await

  • Sintaxis moderna para escribir código asíncrono que parece síncrono. Excelente para mejorar la legibilidad.
  • Reglas:
    • await solo dentro de funciones async.
    • La ejecución se pausa hasta que la promesa se resuelve o rechaza.
    • Perfecto para operaciones en serie.
async function getPost() {
try {
const response = await fetch("https://jsonplaceholder.typicode.com/posts/1");
const data = await response.json();
console.log(data);
} catch (error) {
console.error("Error al obtener post:", error);
}
}
getPost();

PNPM o NPM

  • Son gestores de paquetes
  • Permiten:
    • Instalar librerías (como Astro, Nest, React)
    • Manejar versiones.
    • Ejecutar scripts del proyecto como pnpm dev
  • NPM viene instalado automáticamente con Node
  • PNPM es una alternativa más rápida y eficiente.

Package JSON

  • package.json: contiene metadatos del proyecto y gestiona las dependencias, scripts, y configuraciones necesarias para que la aplicación funcione correctamente.
  • Cómo crear un package.json:
    • npm init -y
    • pnpm init
  • Cómo instalar dependencias:
    • pnpm install
    • pnpm add express
    • pnpm add -D nodemon

JSON: JavaScript Object Notation

  • Es un formato liviano para intercambios de datos.
  • Independiente de otros lenguajes.
  • Fácil de leer y escribir.
  • Está escrito en base a pares de nombres y valores.
  • Todos los lenguajes modernos soportan JSON.
{
"userId": 1,
"id": 1,
"title": "Backend es fácil",
"body": "La mayoría de los alumnos le teme al backend pero es sencillo"
}

File System

  • Módulo nativo que permite interactuar con el sistema de archivos del equipo
  • Permite leer, escribir, modificar, eliminar archivos y directorios.
  • En su mayoría de métodos te ofrecen la versión síncrona y asíncrona
    • Sincrónicas:fs.readFileSync, fs.writeFileSync, etc.
    • Asíncronas:fs.readFile, fs.writeFile, etc.
// Asíncrona
fs.readFile('archivo.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});
// Síncrona
const data = fs.readFileSync('archivo.txt', 'utf8');
console.log(data);

Servidores

  • Es un software o hardware que responde a las solicitudes realizadas por los clientes web y les envía las respuestas correspondientes. Servidores

Arquitectura Cliente-Servidor

  • La arquitectura cliente-servidor es un modelo de comunicación en el que los clientes solicitan recursos o servicios a un servidor, y este último los proporciona en respuesta a esas solicitudes.

Protocolos HTTP y HTTPS

  • HTTP: es el protocolo subyacente de la web y define las reglas para la comunicación entre los clientes y los servidores web.

  • HTTPS: proporciona una capa adicional de seguridad al encriptar los datos transmitidos, lo que ayuda a proteger la privacidad y la integridad de la información.


API

  • API: Application Programming Interface (interfaz de programación de aplicaciones)
  • Reglas y protocolos para la comunicación y la interacción entre diferentes aplicaciones de software.

RESTful

  • REST es un estilo de arquitectura para manejar los estándares de comunicación en la web.
  • Los sistemas que usan REST son denominados RESTful. RESTful

Endpoint

  • Son los puntos de entrada que le damos a nuestro sistema.

  • Los endpoints son los que le permiten a un sistema externo interactuar con nuestras APIs.

  • El request y response pasan a través de nuestro endpoint hacia la API.

  • Los endpoints nos permiten darle seguridad a nuestra API.

  • Podemos exigir un cierto tipo de payload para su funcionamiento.

Códigos de respuesta HTTP

Los códigos se agrupan por su primer dígito:

  • 1xx: Informativos (ej. 100 Continue)
  • 2xx: Éxito (ej. 200 OK)
  • 3xx: Redirecciones (ej. 301 Moved Permanently)
  • 4xx: Errores del cliente (ej. 404 Not Found)
  • 5xx: Errores del servidor (ej. 500 Internal Server Error)

Códigos de estado HTTP comunes

CódigoNombre estándarDescripción breve
200OKLa solicitud fue exitosa.
201CreatedRecurso creado exitosamente (común en peticiones POST).
204No ContentSolicitud exitosa, pero sin contenido que devolver.
301Moved PermanentlyRedirección permanente.
302Found (o Moved Temporarily)Redirección temporal.
304Not ModifiedEl recurso no ha cambiado (usado en cachés).
400Bad RequestLa solicitud tiene un formato incorrecto.
401UnauthorizedNo autorizado (requiere autenticación).
403ForbiddenAcceso denegado aunque esté autenticado.
404Not FoundEl recurso solicitado no existe.
405Method Not AllowedEl método HTTP usado no está permitido para ese recurso.
500Internal Server ErrorError general del servidor.
502Bad GatewayEl servidor recibió una respuesta inválida de otro servidor.
503Service UnavailableEl servidor no está disponible temporalmente.