Есть ли способ вернуть 2 значения из одной функции в облачные функции Firebase и сохранить их в другом узле в базе данных? - PullRequest
0 голосов
/ 05 апреля 2020

Так вот, как я добавляю дочерние узлы и присваиваю им значения в базе данных реального времени firebase с помощью облачных функций firebase.

export const addUserInfo = functions.database
    .ref('/Users/{UserID}')
    .onCreate((snapshot, context) => {
        const userData = snapshot.val()
        const username = userData.username
        const userUID = context.params.UserID 

        console.log(`${username} has UID ${userUID}.`)

        return snapshot.ref.parent!.parent!.child('userInfo').child(`${userUID}`).set({ "username": newUsername, "uid": userUID})
    })

У меня есть другая похожая функция:

export const addUserToWhitelist = functions.database
    .ref('/Users/{UserID}')
    .onCreate((snapshot, context) => {
        const userData = snapshot.val()
        const username = userData.username

        console.log(`${username} has been whitelisted`)

        return snapshot.ref.parent!.parent!.child('whitelist').set({ "username": newUsername})
    })

Итак в основном я добавляю информацию о пользователях в два разных места в базе данных Firebase, используя две уникальные функции.

Вы не можете иметь более одного оператора возврата в одной облачной функции.

Поэтому есть ли способ, которым я могу добавить обе информационные данные в их соответствующие уникальные местоположения в база данных firebase, использующая одну функцию? Я имею в виду, что оператор return второй функции может быть выполнен в самой первой? Это значительно поможет уменьшить размер кода, а также поможет сохранить вызов функции в некоторой степени.

1 Ответ

1 голос
/ 05 апреля 2020

Если вы хотите записать данные в два места в одной облачной функции, вы можете использовать Promise.all, чтобы дождаться завершения обеих записей.

Что-то вроде:

export const addUserToWhitelist = functions.database
    .ref('/Users/{UserID}')
    .onCreate((snapshot, context) => {
        const userData = snapshot.val()
        const username = userData.username

        console.log(`${username} has been whitelisted`)

        const parent = snapshot.ref.parent!.parent!

        return Promise.all([ 
            parent.child('userInfo').child(userUID).set({ "username": newUsername, "uid": userUID}),
            parent.child('whitelist').set({ "username": newUsername})
        ]);
    })

В качестве альтернативы, вы можете выполнить оба обновления в одной операции записи в базу данных, обернув их в одно многопозиционное обновление:

export const addUserToWhitelist = functions.database
    .ref('/Users/{UserID}')
    .onCreate((snapshot, context) => {
        const userData = snapshot.val()
        const username = userData.username

        console.log(`${username} has been whitelisted`)

        let updates = {};
        updates[`userInfo/${userUID}`] = { "username": newUsername, "uid": userUID};
        updates['whitelist'] = { "username": newUsername};

        return snapshot.ref.parent!.parent!.update(updates);

    })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...