【问题标题】:How to handle axios.all request fails如何处理 axios.all 请求失败
【发布时间】:2018-10-22 03:45:54
【问题描述】:

在这个 axios.all 请求示例中,我如何处理请求失败。 IE。如果所有服务器都使用 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);
    });
}

【问题讨论】:

  • then 语句中,您需要处理response.data 不存在或response 返回错误代码的情况。您是否在控制台或命令行中看到特定错误?
  • 当其中一台服务器没有响应时,我的控制台中什么也没有,脚本只是卡住了。

标签: javascript json node.js asynchronous axios


【解决方案1】:

最标准的处理方法是使用递归函数,如下所示。

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

【讨论】:

  • 谢谢,但节点说我:async function monitor() { ^^^^^^^^ SyntaxError: Unexpected token function
  • 你运行的是什么版本的节点?它应该在版本 8 及更高版本中受支持。最新版本是 10。
  • 好的,我现在安装 10.1.0 版,现在又出现错误:at bootstrapNodeJSCore (internal/bootstrap/node.js:576:3) (node:19358) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1) (node:19358) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code
  • 可能存在小的语法错误。我自己没有运行代码,只是想向您展示要点。
  • 如果它不起作用,我怎么能确定这个要点是不是?
猜你喜欢
  • 2014-08-28
  • 2022-10-18
  • 2021-07-13
  • 2012-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-16
相关资源
最近更新 更多