Express.js
Payload limits y resource exhaustion
Explica cómo limitar body, headers, parámetros, profundidad y trabajo por request para evitar consumo excesivo de memoria, CPU y conexiones.
- Última actualización
- Actualizada
- Nivel
- Aplicación
Express.js
Explica cómo limitar body, headers, parámetros, profundidad y trabajo por request para evitar consumo excesivo de memoria, CPU y conexiones.
Una request pequeña puede generar trabajo enorme. Los límites deben proteger bytes, estructura, CPU, memoria, conexiones y operaciones derivadas.
Resource exhaustion ocurre cuando una entrada consume más capacidad de la que el contrato debería permitir:
input
→ parsing
→ validación
→ queries
→ serialización
→ responseCada etapa necesita límites propios. Content-Length solo describe una parte y puede ser falso o inexistente.
Configura express.json({ limit }), URL-encoded, multipart y raw bodies.
Limita profundidad, número de campos, items y longitud de strings.
JSON grande, regex vulnerable, hashing o compresión pueden bloquear el event loop.
Buffers, arrays y responses completas pueden agotar heap.
Queries ilimitadas, joins dinámicos, OFFSET profundo y pool saturado.
Slow clients, uploads, downstreams sin timeout y conexiones keep-alive.
CDN/proxy
→ tamaño de request y headers
Node/Express
→ parser, timeouts y concurrencia
schema
→ arrays, strings y profundidad
caso de uso
→ bulk size y reglas
base de datos
→ statement timeout, constraints y poolapp.use(express.json({ limit: '100kb' }));
const bulkSchema = z.object({
orderIds: z.array(z.string().uuid()).min(1).max(100),
}).strict();El parser limita bytes; el schema limita cantidad de operaciones. Aun así, el caso de uso debe evitar una query por ID y usar una operación set-based.
Una regex con backtracking catastrófico puede consumir segundos con pocos caracteres. Prefiere parsers simples, límites de longitud y librerías revisadas.
Mide event-loop lag; no solo duración HTTP.
Un body comprimido puede expandirse enormemente. Coordina límites del proxy, parser y descompresión. No aceptes archivos comprimidos sin cuotas de tamaño extraído, número de entradas y profundidad.
Node posee headersTimeout, requestTimeout y límites de headers. Un cliente lento puede mantener sockets abiertos sin enviar la request completa.
No construyas un array de millones de filas para después serializarlo. Usa paginación, streaming o export job.
Transfer-Encoding: chunked sin Content-Length.Content-Length.Observa:
Relaciona métricas con endpoint y tenant sin crear cardinalidad incontrolable.
Límites bajos protegen capacidad, pero pueden bloquear casos legítimos. En lugar de ampliar globalmente, crea endpoints especializados, uploads directos o jobs asíncronos.
File uploads seguros aplica límites, streaming, validación de contenido y aislamiento de almacenamiento.