javascript - 如何处理 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);
});
}
解决方案
解决此问题的最标准方法是如下所示的递归函数。
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);
});
});
推荐阅读
- json - 如何将字段根据参数更改的Json转换为Gson?
- opengl - 在 sampler1D 中仅传递 1 个浮点数
- python-3.x - 减去集合时返回绝对值
- ruby-on-rails - 从 Rails 表单中查询 URL 中的参数
- python - 让带有按钮的多标签 tkinter 应用程序正常工作
- spring - Spring Boot REST端点不返回JSON
- node.js - 我的项目有两个版本的相同依赖项。一个在顶级 node_modules 中,另一个在子模块 node_modules 中。Child 使用了错误的版本
- javascript - 如何使用 .map() 方法将值从一页放置到另一页,使用数据作为下一页的坐标
- android - 生成签名包失败,但生成常规包成功 Android Studio
- ssh - 尽管权限有效,ssh 仍会警告未受保护的密钥文件 - 使用 cygwin/Windows 10