node-fetch-retry-timeout
Version:
node-fetch with retries and timeout. Done right.
48 lines (38 loc) • 2.4 kB
Markdown
Minimalistic drop-in replacement for node-fetch. Created because other alternatives were not good for me (and believe me: I really tried hard to avoid creating yet another node-fetch extra feature package).
## Notable differences from default node-fetch behaviour:
1. Default redirect strategy is 'manual' so we get 30x redirects as responses
2. Response timeout is 20s
3. Will consider each 50x response as a bad one and will retry (pass `retryOnHttpResponse: false` to disable)
## Why, god, why?
Major differences from https://www.npmjs.com/package/@adobe/node-fetch-retry:
1. In YANFRT, Retries are configured by amount of attempts and not by total allowed duration of request (more convenient when request latency is fluctuating between 1 and 20 seconds like in most of my use cases)
2. One simple retry strategy: just amount of attempts and delay between requests
3. No Apache OpenWhisk and no other fat
Differences compared to https://www.npmjs.com/package/fetch-retry :
1. YANFRT is based on node-fetch
2. More flexible retry on http response codes (not an array of codes but a callback so you can do `(response.status >= 400 && response.status <= 600) || response.status == 302`
Differences compared to https://www.npmjs.com/package/node-fetch-retry :
1. YANFRT has timeouts handling based on AbortController
1. Can retry based on http response statuses
Since version 1.2 YANFRT supports changing opts of request on each retry (via `beforeRetry` optional callback). This allows switching broken proxies.
See /test/ folder ("can change agent on retry" test)
## Installation
`npm i node-fetch-retry-timeout`
## Example
```js
const fetch = require('node-fetch-retry-timeout')
let response = await fetch('https://google.com', {
method: 'GET',
retry: 2, // number attempts to retry
pause: 500, // pause between requests (ms)
timeout: 5000, // timeout PER 1 REQUEST (ms)
retryOnHttpResponse: r => r.status >= 500, // this is the default implementation of retryOnHttpResponse, pass false to disable
beforeRetry: (retryNum, error) => { // switch opts on retry (retryNum == 1 before first retry is initiated, check the existence of error.response for advanced logic)
return { headers: { 'Switch header': 'header-value' }, agent: SomeRandomAgent }
}
})
```
`npm run test`