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, это ваши сообщения об ошибках - это будет чрезвычайно полезно для других! Гэтсби бросает много вещей в консоль, так что вам придется следить за всем, что является красным или кажется необычным.

Другие вопросы по тегам