首页 > 解决方案 > 有没有办法从 Firebase 云函数中的单个函数返回 2 个值并将它们存储在数据库中的不同节点中?

问题描述

所以这就是我使用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 数据库中的两个不同位置。

单个云函数中不能有超过 1 个 return 语句。

那么有什么方法可以使用单个功能将信息数据添加到firebase数据库中各自独特的位置?我的意思是包含第二个函数的返回语句可以在第一个函数本身中执行吗?这将大大有助于减少代码的大小,也有助于在一定程度上节省函数调用。

标签: androidtypescriptfirebasefirebase-realtime-databasegoogle-cloud-functions

解决方案


如果要将数据写入单个 Cloud Function 中的两个位置,可以使用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);

    })

推荐阅读