首页 > 解决方案 > 如何处理 axios.all 请求失败

问题描述

在这个 axios.all 请求示例中,如何处理请求失败。即,如果所有服务器都使用 JSON 响应,那么一切正常,并且我在一个周期结束时有 JSON 文件。但是,如果其中一台服务器没有响应 JSON 或根本没有响应我在“/data.json”文件中没有任何内容,那么即使所有其他服务器都可以正常工作。如何捕获服务器故障并跳过它?

var fs = require("fs");
var axios = require('axios');
var util = require('util');
var round = 0;
var tmp = {};

var streem = fs.createWriteStream(__dirname + '/data.json', {flags : 'w'});

toFile = function(d) { //
  streem.write(util.format(d));
};
start();
setInterval(start, 27000);

function start(){
    streem = fs.createWriteStream(__dirname + '/data.json', {flags : 'w'});
    monitor();
}

function monitor(){

    axios.all([
    axios.get('server1:api'),
    axios.get('server2:api'),
    axios.get('server3:api'),
    axios.get('server4:api'),
    ]).then(axios.spread((response1, response2, response3, response4) => {

        tmp.servers = {};
        tmp.servers.server1 = {};
        tmp.servers.server1 = response1.data;

        tmp.servers.server2 = {};
        tmp.servers.server2 = response2.data;

        tmp.servers.server3 = {};
        tmp.servers.server3 = response3.data;

        tmp.servers.server4 = {};
        tmp.servers.server4 = response4.data;

        toFile(JSON.stringify(tmp));

        round++;

        streem.end();
        streem.on('finish', () => {
            console.error('Round: ' + round);
        });             

    })).catch(error => {
      console.log(error);
    });
}

标签: javascriptjsonnode.jsasynchronousaxios

解决方案


解决此问题的最标准方法是如下所示的递归函数。

let promises = [
    axios.get('server1:api'),
    axios.get('server2:api'),
    axios.get('server3:api'),
    axios.get('server4:api'),
];

async function monitor() {
    const responses = (arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments))[0];
    const nextPromise = promises.shift();

    if (nextPromise) {
        try {
            const response = await getSentenceFragment(offset);
            responses.push(response);
        }
        catch (error) {
            responses.push({});
        }

        return responses.concat(await monitor(responses));
    } else {
        return responses;
    }
}


monitor([]).then(([response1, response2, response3, response4]) => {
    tmp.servers = {};
    tmp.servers.server1 = {};
    tmp.servers.server1 = response1.data;

    tmp.servers.server2 = {};
    tmp.servers.server2 = response2.data;

    tmp.servers.server3 = {};
    tmp.servers.server3 = response3.data;

    tmp.servers.server4 = {};
    tmp.servers.server4 = response4.data;

    toFile(JSON.stringify(tmp));

    round++;

    streem.end();
    streem.on('finish', () => {
        console.error('Round: ' + round);
    });             
});

推荐阅读