示例说明
该示例解决盲目重试的问题。对 GET 这类幂等请求,网络抖动或网关 502 属于瞬态故障,值得自动重试;而 4xx 业务错误重试只会放大故障。got 的 retry 选项可以把重试范围精确限定在可重试的方法、状态码与错误码上,并用 calculateDelay 封顶退避时间。
技术要点
- methods 限定只重试幂等的 GET 请求
- statusCodes 白名单区分瞬态与永久故障
- calculateDelay 给指数退避设置 8 秒上限
代码解读
代码用 got.extend 创建复用配置的客户端实例:limit 控制 总次数,beforeRetry 钩子在每次重试前打印目标 URL 与第几次尝试,方便定位下游抖动。request 超时独立于重试,保证单次尝试不会无限等待,最终 json() 直接返回解析后的对象。
使用建议
非幂等的 POST 默认不应自动重试,除非服务端实现了幂等键。calculateDelay 的封顶值要与调用方的整体超时预算匹配,避免重试链路超过上游容忍时间。生产环境建议把重试日志接入统一日志管道。
代码示例
import got from 'got';
const client = got.extend({
retry: {
limit: 4,
methods: ['GET'],
statusCodes: [408, 429, 500, 502, 503, 504],
calculateDelay: ({ computedValue }) => Math.min(computedValue, 8000),
errorCodes: ['ETIMEDOUT', 'ECONNRESET', 'ECONNREFUSED'],
},
timeout: { request: 10_000 },
hooks: {
beforeRetry: [
({ attemptCount, url }) => {
console.log('retrying', url.href, 'attempt', attemptCount);
},
],
},
});
const body = await client('https://api.example.com/orders').json();