如何使用 node-fetch 重试 api 调用

vig*_*h d 2 node.js node-fetch

我正在尝试在我的节点 js 代码中使用 node-fetch 向外部 API 发布请求。
如果在执行 POST 请求时出现任何超时或网络故障,我想重试该请求 3 次。
你能告诉我如何使用 node-fetch 重试请求吗?我看到有一个 npm 模块https://www.npmjs.com/package/node-fetch-retry但它似乎没有按预期工作,而且它也不接受重试之间的重试间隔。任何代码片段都会非常有帮助。

编辑:

谢谢我尝试使用 promise-fn-retry 但它似乎没有做任何重试。下面是我通过关闭 WIFI 然后执行 FETCH 调用以查看它是否重试 3 次而尝试的代码片段。但它只执行一次获取并返回错误。

const promiseFn = () => fetch(url,{method:"POST",headers:header,body:JSON.stringify(payload)});
const options = {
  times: 3,
  initialDelay: 100,
  onRetry: (error) => {
    console.log(error);
      }
};
console.log('PromiseFn result ****'+retry(promiseFn, options).then(res => res.json()).then((res)=>{console.log('Promise Fn result is'+JSON.stringify(res))}).catch((err)=>{console.log('Error in Promise Fn'+err)}));
Run Code Online (Sandbox Code Playgroud)

Mar*_*olo 8

这个片段在过去帮助了我!希望这是你正在寻找的

const fetch = require('node-fetch')

const delay = ms => {
    return new Promise(resolve => {
        setTimeout(() => {
            resolve()
        }, ms)
    })
}
const retryFetch = (url, fetchOptions = {}, retries = 3, retryDelay = 1000, timeout) => {
    return new Promise((resolve, reject) => {

        // check for timeout
        if(timeout) {
          setTimeout(() => {
            reject('error: timeout') // reject if over time
          }, timeout)
        }

        const wrapper = n => {
            fetch(url, fetchOptions)
                .then(res => { resolve(res) })
                .catch(async err => {
                    if(n > 0) {
                        // console.log(`retrying ${n}`)
                        await delay(retryDelay)
                        wrapper(--n)
                    } else {
                        reject(err)
                    }
                })
        }

        wrapper(retries)
    })
}

retryFetch('http://localhost:8080/test', {}, 20)
    .then(res => res.text())
    .then(console.log)
    .catch(console.error)
Run Code Online (Sandbox Code Playgroud)

  • 这工作正常,但是我们有什么办法可以指定超时吗? (2认同)