Ax ios сокращает продолжительность ETIMEDOUT - PullRequest
0 голосов
/ 03 августа 2020

У меня есть серверное приложение (назовем ServerApp1 ), которое будет работать на экземпляре Azure виртуальной машины. У меня есть отдельный сервер (который мы назовем ServerApp2 ) на другом компьютере, который будет взаимодействовать с ServerApp1 и отдельным клиентом. Виртуальная машина Azure будет раскручиваться и / или отключаться в зависимости от необходимости, поэтому вполне возможно, что виртуальная машина (и, следовательно, ServerApp1) даже не доживает до ответа на запрос от ServerApp2. Мой клиент опрашивает ServerApp2, чтобы узнать статус ServerApp1, но если виртуальная машина в настоящее время не работает, этот запрос зависает примерно на 20 секунд, прежде чем выдаст ошибку с кодом ETIMEDOUT . Я бы хотел, чтобы ServerApp2 сделал запрос к ServerApp1, чтобы проверить, жив ли он, но после примерно 1 или 2 секунд отсутствия ответа просто остановитесь и скажите клиенту, что он в настоящее время не работает. Я думал, что могу обойтись без добавления параметра {timeout: 2000} к моему вызову ax ios, но это, похоже, не меняет поведение каким-либо заметным образом. Вот функция, которая вызывается, когда клиент спрашивает ServerApp2 о статусе ServerApp1:

router.get('/getCurrentConsoleStatus', function(req, res) {
    async function getStatus() {
        try {
            const result = await consoleDataService.getConsoleStatus();

            if (result.message === 'Begin listen for job.') {
                console.log('The app is ready!');
            } else {
                console.log('The console app is not ready');
            }
        } catch (error) {
            console.log(`Error communicating with console app: ${error}`);
        }
    }
    getStatus();
});

У меня есть функция, которая создает объект root Ax ios:

var axios = require('axios');

module.exports = axios.create({
    baseURL: 'baseURL',
    timeout: 1000,
    headers: {
        'Content-type': 'application/json'
    }
});

А затем функция, которая вызывается в consoleDataService.getConsoleStatus () , выглядит так:

exports.getConsoleStatus = async function() {
    const res = await axios({
        method: 'get',
        url: '/status'
    });
    return res.data;
};

1 Ответ

0 голосов
/ 06 августа 2020

Спасибо @JonEdwards за предложение использовать Promise.race . Я решил проблему с помощью этой функции, которая пытается взять первое обещание, которое разрешается первым.

exports.getConsoleStatus = () => {
    var sleep = function() {
        return new Promise(resolve => {
            setTimeout(function() {
                resolve({ status: false });
            }, 2000);
        });
    };

    var fetch = async function() {
        const res = await http({
            method: 'get',
            url: '/status'
        });
        return new Promise(resolve => {
            resolve(res.data);
        });
    };

    async function getStatus() {
        const asyncFunctions = [sleep(), fetch()];
        const result = await Promise.race(asyncFunctions);
        return result;
    }

    return getStatus();
};
...