JavaScript
Node.js
promise
axios

axiosの複数レスポンスを集約する方法


経緯

非同期で複数のサーバのAPIへリクエストし、そのレスポンス情報を集約して1つのオブジェクトにする処理が必要になった。

Web検索で理想のかたちがヒットしなかったので、備忘も含めて記載します。


環境

Node.js

axios: 0.18.0


注目点(2019/03/14更新)

axios.all

axios.spread


Promise.all


実装方法(2019/03/14更新)

const axios = require('axios')

function getServers(addresses) {
return Promise.all(
addresses.map((address) =>
axios.get(`http://${address}/hogeapi`)
)
).then((responses) => {
const allResponse = {};
allResponse.servers = [];
for (const res of responses) {
// 必要ならこの辺でレスポンスを加工
allResponse.servers.push(res.data);
}
return Promise.resolve(allResponse);
}));
}

// IPの配列
const addresses = ["xx.xx.xx.xx", "yy.yy.yy.yy"];
getServers(addresses)
.then((allResponse) => {
// ここで集約したオブジェクトを取得
console.log(allResponse);
});

変更前のコード

const axios = require('axios')

function getServers(addresses) {
return axios.all(
addresses.map((address) =>
axios.get(`http://${address}/hogeapi`)
)
).then(axios.spread((...responses) => {
const allResponse = {};
allResponse.servers = [];
for (const res of responses) {
// 必要ならこの辺でレスポンスを加工
allResponse.servers.push(res.data);
}
return Promise.resolve(allResponse);
}));
}

// IPの配列
const addresses = ["xx.xx.xx.xx", "yy.yy.yy.yy"];
getServers(addresses)
.then((allResponse) => {
// ここで集約したオブジェクトを取得
console.log(allResponse);
});



最後に

いかがだったでしょうか?良い記事だと思った方は「いいね」のクリックをお願いします。

まだまだ初心者なので、もっと良い方法があるなどあればコメントをいただけると助かります。