Timeouts em Todo Lugar
Defina timeouts para requisições do servidor, chamadas HTTP de saída, consultas ao banco de dados e filas - esperas ilimitadas são a causa mais comum de falhas em cascata em APIs Node.js.
Busque em todas as páginas da documentação
Defina timeouts para requisições do servidor, chamadas HTTP de saída, consultas ao banco de dados e filas - esperas ilimitadas são a causa mais comum de falhas em cascata em APIs Node.js.
Cartão de receita de referência rápida - pronto para copiar e colar.
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) });Quando usar isso:
fetch ou axios sem timeout 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, // opção node-pg que envolve o timeout da instrução
});
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);O que isso demonstra:
fetch de saída limitado a 8s - menor que o timeout de requisição do servidor de 30s.AbortError mapeado para 504 Gateway Timeout para clientes.createServer protegem contra ataques slowloris e sockets travados.requestTimeout do Servidor - tempo máximo para requisição completa no socket (servidor HTTP Node).AbortSignal.timeout - aborta fetch após N ms no Node 18+.statement_timeout (Postgres) - o banco de dados encerra consultas longas independentemente do estado do aplicativo.| Camada | Valor Típico | Resposta de Falha |
|---|---|---|
| HTTP de Saída | Caminho do usuário de 2-5s | 502/504 |
| Consulta DB | 3-10s | 500 + log |
| Orçamento do Manipulador | 10-15s | 504 |
requestTimeout do Servidor | 30s | reset de conexão |
| LB ocioso | 60s | 502 |
SET statement_timeout = '5s';
-- ou por role:
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 cobre conexão + resposta; use signal: AbortSignal.timeout() para controle mais refinado.AbortSignal.timeout.headersTimeout - deve exceder ligeiramente keepAliveTimeout no servidor HTTP Node.finally. Correção: evite handles vazados.| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| AbortSignal.timeout | Fetch nativo no Node 18+ | Node 16 legado |
| undici Agent timeouts | Padrões de cliente compartilhados | Fetch único |
| axios timeout | Base de código baseada em Axios | Apenas fetch nativo |
| Contexto de deadline (gRPC) | Serviços gRPC | APIs REST JSON |
2-5s por salto de saída; orçamento total do manipulador de 10-15s; máximo do servidor de 30s. Ajuste por SLO.
O timeout da consulta do DB deve ser menor que o orçamento do manipulador - falhe a consulta antes do prazo HTTP.
Sem padrão - espera infinita. Sempre passe signal: AbortSignal.timeout(ms).
Use serverFactory com opções createServer ou padrões de plugin @fastify/request-timeout.
Defina timeout nas opções do job - separado dos timeouts HTTP, mas com a mesma filosofia.
504 gateway timeout - upstream muito lento. 503 service unavailable - dependência inativa ou circuito aberto.
Aplicativos móveis também devem ter timeout - mas o servidor não deve esperar pela paciência do cliente.
Timeouts acionam falhas que incrementam os contadores do breaker. Veja Circuit Breakers.
Versões da Pilha: Esta página foi escrita para Node.js 24.18.0 (Active LTS), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 e NestJS 11.
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026