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)
这个片段在过去帮助了我!希望这是你正在寻找的
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)