Как повторить вызов API с помощью node-fetch - PullRequest
1 голос
/ 22 января 2020

Я пытаюсь отправить запрос к внешнему API с помощью извлечения узла в моем коде node js.
Я хочу повторить запрос 3 раза, если при выполнении запроса POST возникли тайм-ауты или сбои сети.
Не могли бы вы дать мне знать, как повторить запрос, используя node-fetch? Я вижу, что есть npm модуль https://www.npmjs.com/package/node-fetch-retry, но он, похоже, не работает должным образом и не принимает интервал между попытками. Любые фрагменты кода будут очень полезны.

РЕДАКТИРОВАТЬ:

Спасибо, я попытался использовать обещание-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)}));

Ответы [ 2 ]

2 голосов
/ 22 января 2020

этот фрагмент помог мне в прошлом! Надеюсь, это то, что вы ищете

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)
0 голосов
/ 22 января 2020

Попробуйте пакет обещание-fn-retry , у него есть свойства, чтобы указать время повтора, начальное время задержки и методы обратного вызова для обработки неудачных выборок / обещаний.

Надеюсь, это поможет!

...