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

Posted

技术标签:

【中文标题】有没有办法从 Firebase 云函数中的单个函数返回 2 个值并将它们存储在数据库中的不同节点中?【英文标题】:Is there any way to return 2 values from a single function in Firebase cloud functions and store them in a different node in database? 【发布时间】:2020-07-17 11:40:23 【问题描述】:

这就是我使用 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 个。

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

【问题讨论】:

【参考方案1】:

如果您想将数据写入单个 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);

    )

【讨论】:

以上是关于有没有办法从 Firebase 云函数中的单个函数返回 2 个值并将它们存储在数据库中的不同节点中?的主要内容,如果未能解决你的问题,请参考以下文章

Firebase:我可以在 Firebase 云功能中“不确认”一条 PubSub 消息吗?

访问另一个项目中的 firebase 函数环境变量

Firebase 异步等待风格的云函数

是否可以从firebase云函数node.js更新firestore中的map类型字段?

如何从 Firebase 云函数中的通配符获取数据

在 Firebase 云函数中解压 OAuth2 响应