gatsby-node.js несколько вызовов API
У меня проблемы с загрузкой нескольких узлов из разных вызовов API. Каждый отдельный тип узла работает нормально, но gatsby-node.js позволяет устанавливать только один тип, поэтому вся работа CreateNode должна выполняться за один раз. Я не могу понять, не работает ли он из-за мультисинхронных вызовов или что-то еще...
Я перепробовал много разных методов, один из них - последний эксперимент, но все они провалились.
const axios = require('axios');
const crypto = require('crypto');
exports.sourceNodes = async ({ actions }) => {
const { createNode } = actions;
const fetchUsers = () => axios.get('http://192.168.0.71/api/manager/users/user/', {
method: 'GET',
headers: {
'Authorization': 'Bearer XXXX',
},
}).then(res => {
const hUsers = Object.keys(res.data).map((row,i) => {
const userNode = {
id: res.data[row].id,
parent: null,
internal: {
type: 'HomeyUsers',
},
children: [],
email: res.data[row].email,
name: res.data[row].name,
properties: res.data[row].properties,
enabled: res.data[row].enabled,
verified: res.data[row].verified,
picture: res.data[row].avatar,
role: res.data[row].role,
present: res.data[row].present,
asleep: res.data[row].asleep,
inviteUrl: res.data[row].inviteURL,
inviteToken: res.data[row].inviteToken
};
const contentDigest = crypto
.createHash('md5')
.update(JSON.stringify(userNode))
.digest('hex');
userNode.internal.contentDigest = contentDigest;
createNode(userNode);
});
});
const fetchDevices = () => axios.get('http://192.168.0.71/api/manager/devices/device/',{
method: 'GET',
headers: {
'Authorization': 'Bearer XXXX',
},
}).then(res => {
//const res = await fetchDevices();
const hDevices = Object.keys(res.data).map((row,i) => {
const deviceNode = {
id: res.data[row].id,
parent: null,
internal: {
type: 'HomeyDevices',
},
children: [],
name: res.data[row].name,
zone: res.data[row].zone
};
const contentDigest = crypto
.createHash('md5')
.update(JSON.stringify(deviceNode))
.digest('hex');
deviceNode.internal.contentDigest = contentDigest;
createNode(deviceNode);
});
});
const fetchFlows = () => axios.get('http://192.168.0.71/api/manager/flow/flow/',{
method: 'GET',
headers: {
'Authorization': 'Bearer XXXX',
},
}).then(res => {
//const res = await fetchFlows();
const hFlows = Object.keys(res.data).map((row,i) => {
const flowNode = {
id: res.data[row].id,
parent: '__SOURCE__',
internal: {
type: 'HomeyFlows',
},
children: [],
name: res.data[row].name,
folder: res.data[row].folder,
enabled: res.data[row].enabled,
actions: res.data[row].actions,
};
const contentDigest = crypto
.createHash('md5')
.update(JSON.stringify(flowNode))
.digest('hex');
flowNode.internal.contentDigest = contentDigest;
createNode(flowNode);
});
});
return Promise.all([hUsers, hDevices, hFlows]);
}
1 ответ
Ваш код определил 3 функции, которые возвращают обещания:
const fetchUsers = () => axios.get(...)
const fetchDevices = () => axios.get(...)
const fetchFlows = () => axios.get(...)
Но ты нигде не звонил им. Promise.all
ожидал массив обещаний, но вы передали 3 переменные, которые не были определены в одной и той же области видимости
return Promise.all([hUsers, hDevices, hFlows]);
Возможно, это приведет вас немного дальше:
return Promise.all([fetchUsers(), fetchDevices(), fetchFlows()]);
Если это все еще не работает, первое, что вы должны поделиться на SO, это ваши сообщения об ошибках - это будет чрезвычайно полезно для других! Гэтсби бросает много вещей в консоль, так что вам придется следить за всем, что является красным или кажется необычным.