Nodejs Шаблон HTTP-повторов - PullRequest
0 голосов
/ 09 апреля 2020

JS новичок ie здесь! Я пытаюсь реализовать повторную логику c, используя встроенный метод запроса https lib (я должен сделать POST). Также реализуем это в Azure Функции.

Редактировать Я изменил код, и он повторяет ошибки HTTP, но не сокет или ошибки подключения. Do c говорит, что в случае ошибок сокета, сначала будет вызвано («сокет»), а затем - («ошибка»). Но мое приложение никогда не повторяет попытки при возникновении ошибки ECONNRESET или ETIMEDOUT.

async function fetchWithRetry(options, reqBody,context) {

    return new Promise((resolve, reject) => {
        let attempts = 1;
        const fetch_retry = (options, n) => {
            let httpsReq = httpsClient.request(options, function (res) {
                const code = res.statusCode;
                const message = res.statusMessage;
                if (n === 0) {
                    reject({
                        'status': code,
                        'message': message
                    });
                } else if (code < 200 || code >= 300) {
                    context.log("Retry again: Got back code: " + code + " message: " + message);
                    context.log("With delay " + attempts * delay);
                    setTimeout(() => {
                        attempts++;
                        fetch_retry(options, n - 1);
                    }, attempts * delay);
                } else if (code === 201) {
                    resolve({
                        'status': code,
                        'message': message
                    });
                } else {
                    var body = '';
                    res.on('data', function (chunk) {
                        body = body + chunk;
                    });
                    res.on('end', function () {
                        resolve(JSON.parse(body));
                    });
                }
                httpsReq.on('error', function (error) {
                    context.log("Retry again: Got back code: " + code + " message: " + message + " error: " + error);
                    context.log("With delay " + attempts * delay);
                    setTimeout(() => {
                        attempts++;
                        fetch_retry(options, n - 1);
                    }, attempts * delay);
                });
            });
            httpsReq.write(reqBody);
            httpsReq.end();
        };
        return fetch_retry(options, numberOfRetries);
    });

}

При возникновении ошибки код вызывает метод end () и моя функция умирает. Могу ли я получить помощь, чтобы исправить это. Также пытаюсь обернуть это обещание, потому что это лучшая практика.

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Вместо return resolve(json); просто resolve(json);, а вместо throw reject(json); просто reject(json);

0 голосов
/ 15 апреля 2020

Нашли решение, ловите ошибки сокета в обработчике ошибок запроса, а не в ответе

`Req.on('error', function (error) {
            context.log("Retry again: " + error);
            context.log("With delay " + attempts * delay);
            setTimeout(() => {
                attempts++;
                fetch_retry(options, n - 1);
            }, attempts * delay);
        });`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...