繁体   English   中英

如何处理axios.all请求失败

[英]How to handle axios.all request fails

在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);
    });
}

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

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);
    });             
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM