Skip to content

Commit bcdf985

Browse files
committed
react actualizado
1 parent 18c5828 commit bcdf985

19 files changed

Lines changed: 1414 additions & 14 deletions

src/content/nodejs/api-rest.md

Lines changed: 49 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,51 @@ pubDate: '04/03/2025'
55
collection: nodejs
66
---
77

8-
Una **API REST** permite la comunicación entre cliente y servidor usando HTTP y siguiendo una serie de convenciones.
8+
Una **API REST** (Representational State Transfer) es una forma de diseñar servicios web que permite la comunicación entre un cliente (frontend, Postman, otra API…) y un servidor mediante HTTP.
9+
10+
Es el tipo de API más utilizado en aplicaciones web modernas.
911

1012
## Principios REST
11-
- Uso de métodos HTTP
12-
- URLs que representan recursos
13-
- Comunicación sin estado (stateless)
14-
- Respuestas en formato JSON
15-
16-
## Métodos HTTP
17-
| Método | Acción |
18-
|------|-------|
13+
Una API REST bien diseñada cumple los siguientes principios:
14+
15+
- **Uso de métodos HTTP** para definir acciones
16+
- **URLs que representan recursos**, no acciones
17+
- **Stateless**: el servidor no guarda estado entre peticiones
18+
- **Formato JSON** como estándar de intercambio de datos
19+
20+
## Métodos HTTP más comunes
21+
| Método | Uso |
22+
|------|-----|
1923
| GET | Obtener datos |
20-
| POST | Crear |
21-
| PUT | Actualizar |
24+
| POST | Crear un recurso |
25+
| PUT | Actualizar un recurso completo |
26+
| PATCH | Actualizar parcialmente |
2227
| DELETE | Eliminar |
2328

24-
## Ejemplo de endpoints
29+
## Ejemplo de recursos
30+
Un recurso representa una entidad del sistema:
31+
32+
- `/users`
33+
- `/products`
34+
- `/orders`
35+
36+
Incorrecto:
37+
38+
```js
39+
/getUsers
40+
/createUser
41+
```
42+
43+
Correcto:
44+
```js
45+
GET /users
46+
POST /users
47+
```
48+
49+
## Ejemplo de endpoints REST
2550
| Método | Ruta | Acción |
2651
|------|-----|-------|
27-
| GET | /users | Obtener usuarios |
52+
| GET | /users | Obtener todos |
2853
| POST | /users | Crear usuario |
2954
| GET | /users/:id | Obtener uno |
3055
| PUT | /users/:id | Actualizar |
@@ -34,6 +59,16 @@ Una **API REST** permite la comunicación entre cliente y servidor usando HTTP y
3459
```js
3560
exports.getUsers = async (req, res) => {
3661
const users = await User.find();
37-
res.json(users);
62+
res.status(200).json(users);
3863
};
3964
```
65+
66+
## Códigos de estado HTTP
67+
Usar correctamente los códigos de estado es parte de REST:
68+
69+
- 200 OK
70+
- 201 Created
71+
- 400 Bad Request
72+
- 401 Unauthorized
73+
- 404 Not Found
74+
- 500 Internal Server Error

src/content/nodejs/auth0-jwt.md

Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
---
2+
title: Auth0 y JWT
3+
description: ""
4+
pubDate: '10/03/2024'
5+
collection: nodejs
6+
---
7+
La **autenticación** es el proceso mediante el cual una aplicación verifica la identidad de un usuario antes de permitirle acceder a determinados recursos.
8+
9+
En aplicaciones backend con Node.js es muy habitual utilizar **JWT (JSON Web Token)**, ya sea de forma manual o apoyándose en servicios externos como **Auth0**.
10+
11+
## ¿Qué es un JWT?
12+
13+
Un **JWT** es un token cifrado que contiene información del usuario y permite identificarlo sin necesidad de guardar sesiones complejas en el servidor.
14+
15+
Características principales:
16+
- Es **autocontenido** (lleva la información dentro)
17+
- Tiene **fecha de caducidad**
18+
- Se puede verificar usando un **secreto**
19+
- Se envía en cada petición autenticada
20+
21+
22+
## Flujo típico de autenticación con JWT
23+
24+
1. El usuario hace login
25+
2. El servidor valida las credenciales
26+
3. Se genera un JWT
27+
4. El token se guarda en la sesión o en el cliente
28+
5. En cada petición protegida se verifica el token
29+
30+
31+
32+
## Generación del token
33+
34+
En este ejemplo se utiliza la librería `jsonwebtoken` y un secreto cifrado almacenado en un archivo de configuración.
35+
36+
### Función `generateToken`
37+
38+
Esta función genera un token que contiene el `id` del usuario y caduca en una hora.
39+
40+
```js
41+
const jwt = require('jsonwebtoken');
42+
const hashedSecret = require('../crypto/config.js');
43+
44+
const generateToken = (user) => {
45+
return jwt.sign(
46+
{
47+
user: user.id,
48+
},
49+
hashedSecret,
50+
{ expiresIn: '1h' }
51+
);
52+
};
53+
```
54+
55+
### ¿Qué hace esta función?
56+
- Inserta el identificador del usuario en el payload
57+
- Firma el token con un secreto
58+
- Define un tiempo de expiración
59+
- Devuelve el JWT generado
60+
61+
62+
63+
## Almacenamiento del token en sesión
64+
65+
En este enfoque, el token se guarda en la **sesión del servidor**, normalmente tras el login:
66+
67+
```js
68+
req.session.token = generateToken(user);
69+
```
70+
71+
Esto permite que el backend controle el acceso sin exponer el token directamente al frontend.
72+
73+
74+
75+
## Middleware `isAuthenticated`
76+
77+
Este middleware comprueba si existe un token en la sesión.
78+
79+
```js
80+
const isAuthenticated = (req, res, next) => {
81+
if (req.session.token) next();
82+
else next('route');
83+
};
84+
```
85+
86+
### ¿Para qué sirve?
87+
- Verifica si el usuario está autenticado
88+
- Si hay token → continúa
89+
- Si no hay token → salta la ruta protegida
90+
91+
Es útil para proteger rutas sin validar aún el contenido del token.
92+
93+
94+
95+
## Verificación del token
96+
97+
Antes de permitir el acceso a rutas protegidas, es necesario **verificar que el token es válido**.
98+
99+
### Middleware `verifyToken`
100+
101+
```js
102+
const verifyToken = (req, res, next) => {
103+
const token = req.session.token;
104+
105+
if (!token) {
106+
return res.status(401).json({ message: 'token no generado' });
107+
}
108+
109+
jwt.verify(token, hashedSecret, (err, decoded) => {
110+
if (err) {
111+
return res.status(401).json({ message: 'token invalido' });
112+
}
113+
114+
req.user = decoded.user;
115+
next();
116+
});
117+
};
118+
```
119+
120+
### ¿Qué hace este middleware?
121+
- Comprueba que existe un token
122+
- Verifica la firma y la expiración
123+
- Extrae el usuario del token
124+
- Lo añade a `req.user`
125+
- Permite continuar si es válido
126+
127+
128+
## Uso en rutas protegidas
129+
130+
Ejemplo de ruta protegida usando ambos middlewares:
131+
132+
```
133+
app.get('/profile', isAuthenticated, verifyToken, (req, res) => {
134+
res.json({
135+
message: 'Acceso permitido',
136+
userId: req.user
137+
});
138+
});
139+
```
140+
141+
Solo los usuarios autenticados con token válido podrán acceder.
142+
143+
144+
## Relación con Auth0
145+
146+
**Auth0** actúa como proveedor externo de autenticación:
147+
148+
- Gestiona login y registro
149+
- Devuelve un JWT
150+
- El backend solo debe verificar el token
151+
152+
En lugar de generar el token manualmente, Auth0 lo proporciona y se valida con su clave pública.
153+
154+
Ventajas:
155+
- No gestionas contraseñas
156+
- Seguridad profesional
157+
- Compatible con OAuth
158+
- Ideal para proyectos reales
159+
160+
161+
## Resumen
162+
163+
- JWT permite autenticar usuarios sin sesiones complejas
164+
- El token contiene información del usuario
165+
- Se genera al hacer login
166+
- Se verifica en cada petición protegida
167+
- Auth0 automatiza todo este proceso
168+
169+
Este enfoque es ampliamente utilizado en APIs REST modernas.

src/content/nodejs/scraping.md

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
---
2+
title: Scraping
3+
description: ""
4+
pubDate: '09/03/2024'
5+
collection: nodejs
6+
---
7+
8+
El **scraping** consiste en obtener información de páginas web de forma automatizada, simulando el comportamiento de un usuario o de un navegador.
9+
10+
Se utiliza para recolectar datos públicos disponibles en la web.
11+
12+
## Casos de uso habituales
13+
- Comparadores de precios
14+
- Listados de ofertas
15+
- Monitorización de cambios en una web
16+
- Extracción de información pública
17+
18+
## Herramientas más comunes
19+
- **axios / fetch** → realizar peticiones HTTP
20+
- **cheerio** → analizar HTML (similar a jQuery)
21+
- **puppeteer** → navegador real (Chrome)
22+
23+
## Scraping estático vs dinámico
24+
- **Estático**: HTML generado en servidor (axios + cheerio)
25+
- **Dinámico**: contenido generado por JavaScript (puppeteer)
26+
27+
## Ejemplo con axios y cheerio
28+
```js
29+
const axios = require("axios");
30+
const cheerio = require("cheerio");
31+
32+
const scrapeTitles = async () => {
33+
const { data } = await axios.get("https://example.com");
34+
const $ = cheerio.load(data);
35+
36+
const titles = [];
37+
$("h1").each((i, el) => {
38+
titles.push($(el).text());
39+
});
40+
41+
return titles;
42+
};
43+
```
44+
45+
## Ejemplo de uso en una API
46+
```js
47+
app.get("/scrape", async (req, res) => {
48+
const data = await scrapeTitles();
49+
res.json(data);
50+
});
51+
```
52+
53+
## Consideraciones legales y éticas
54+
- Respetar `robots.txt`
55+
- No saturar servidores
56+
- Scraping solo de datos públicos
57+
- Revisar términos de uso
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
---
2+
title: Arquitectura de componentes
3+
description: ""
4+
pubDate: '01/04/2025'
5+
collection: react
6+
---
7+
8+
Una buena arquitectura de componentes facilita el mantenimiento y escalabilidad de una aplicación React.
9+
10+
11+
## Componentes presentacionales y contenedores
12+
13+
- **Presentacionales**: solo UI
14+
- **Contenedores**: lógica y datos
15+
16+
17+
## Ejemplo
18+
19+
```js
20+
function UserView({ user }) {
21+
return <p>{user.name}</p>;
22+
}
23+
```
24+
25+
```js
26+
function UserContainer() {
27+
const user = { name: "Sori" };
28+
return <UserView user={user} />;
29+
}
30+
```
31+
32+
33+
## Organización de carpetas
34+
35+
```markdown
36+
components/
37+
├── User/
38+
│ ├── UserView.jsx
39+
│ └── UserContainer.jsx
40+
```
41+
42+
## Reglas básicas
43+
- Un componente = una responsabilidad
44+
- Evitar componentes demasiado grandes
45+
- Reutilizar antes de duplicar

0 commit comments

Comments
 (0)