Tiempos de espera en todas partes
Establece tiempos de espera en las solicitudes del servidor, HTTP saliente, consultas de bases de datos y colas; las esperas ilimitadas son la causa más común de interrupciones en cascada de la API de Node.js.
Busca en todas las páginas de la documentación
Establece tiempos de espera en las solicitudes del servidor, HTTP saliente, consultas de bases de datos y colas; las esperas ilimitadas son la causa más común de interrupciones en cascada de la API de Node.js.
Tarjeta de receta de referencia rápida: lista para copiar y pegar.
import { createServer } from "node:http";
const server = createServer(app);
server.requestTimeout = 30_000;
server.headersTimeout = 35_000;
server.keepAliveTimeout = 65_000;
const data = await fetch(url, { signal: AbortSignal.timeout(5_000) });Cuándo usarlo:
fetch o axios sin tiempo de espera explícito.import express from "express";
import { createServer } from "node:http";
import pg from "pg";
const pool = new pg.Pool({
connectionString: process.env.DATABASE_URL,
connectionTimeoutMillis: 3_000,
query_timeout: 5_000, // opción de node-pg que envuelve el tiempo de espera de la declaración
});
const app = express();
app.get("/reports/:id", async (req, res) => {
const controller = AbortController ? new AbortController() : null;
const deadline = setTimeout(() => controller?.abort(), 8_000);
try {
const report = await pool.query(
"SELECT * FROM reports WHERE id = $1",
[req.params.id]
);
const enrichment = await fetch(
`https://analytics.internal/enrich/${req.params.id}`,
{ signal: controller?.signal ?? AbortSignal.timeout(8_000) }
);
if (!enrichment.ok) {
return res.status(502).json({ error: "Analytics unavailable" });
}
res.json({ report: report.rows[0], analytics: await enrichment.json() });
} catch (err) {
if ((err as Error).name === "AbortError") {
return res.status(504).json({ error: "Upstream timeout" });
}
throw err;
} finally {
clearTimeout(deadline);
}
});
const server = createServer(app);
server.requestTimeout = 30_000;
server.listen(3000);Lo que esto demuestra:
fetch saliente limitado a 8s, menos que el tiempo de espera de solicitud del servidor de 30s.AbortError mapeado a 504 Gateway Timeout para clientes.createServer protegen contra slowloris y sockets colgados.requestTimeout del servidor - tiempo máximo para una solicitud completa en el socket (servidor HTTP de Node).AbortSignal.timeout - aborta fetch después de N ms en Node 18+.statement_timeout (Postgres) - la base de datos elimina consultas largas independientemente del estado de la aplicación.| Capa | Valor típico | Respuesta de fallo |
|---|---|---|
| HTTP saliente | 2-5s ruta de usuario | 502/504 |
| Consulta de base de datos | 3-10s | 500 + registro |
| Presupuesto del manejador | 10-15s | 504 |
requestTimeout del servidor | 30s | restablecimiento de conexión |
| LB inactivo | 60s | 502 |
SET statement_timeout = '5s';
-- o por rol:
ALTER ROLE app_user SET statement_timeout = '5s';await pool.query("SET statement_timeout = 5000");import axios from "axios";
const client = axios.create({ timeout: 5_000 });timeout cubre la conexión + la respuesta; usa signal: AbortSignal.timeout() para un control más preciso.AbortSignal.timeout.headersTimeout - debe exceder ligeramente keepAliveTimeout en el servidor HTTP de Node.finally. Solución: evita manejadores filtrados.| Alternativa | Usar cuándo | No usar cuándo |
|---|---|---|
| AbortSignal.timeout | fetch nativo en Node 18+ | Node 16 heredado |
| Tiempos de espera del agente undici | Valores predeterminados de cliente compartidos | fetch único |
| Tiempo de espera de Axios | Código base basado en Axios | Solo fetch nativo |
| Contexto de plazo (gRPC) | Servicios gRPC | API REST JSON |
2-5s por salto saliente; 10-15s de presupuesto total del manejador; 30s máximo del servidor. Ajustar por SLO.
El tiempo de espera de la consulta de la base de datos debe ser menor que el presupuesto del manejador; falla la consulta antes del plazo HTTP.
No hay valor predeterminado, espera infinita. Siempre pasa signal: AbortSignal.timeout(ms).
Usa serverFactory con opciones de createServer o patrones de complemento @fastify/request-timeout.
Establece timeout en las opciones del trabajo, separado de los tiempos de espera HTTP pero con la misma filosofía.
504 tiempo de espera de la puerta de enlace: la capa superior es demasiado lenta. 503 servicio no disponible: la dependencia está caída o el circuito está abierto.
Las aplicaciones móviles también deben tener tiempo de espera, pero el servidor no debe esperar la paciencia del cliente.
Los tiempos de espera activan fallos que incrementan los contadores del disyuntor. Consulta Disyuntores.
Versiones de la pila: Esta página fue escrita para Node.js 24.18.0 (LTS activa), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 y NestJS 11.
Revisado por Chris St. John·Última actualización: 16 jul 2026