在查询数据库后,Firestore Cloud Function查询返回值吗?

时间:2018-07-28 03:15:24

标签: javascript node.js firebase google-cloud-functions

当前,我正在查询数据库中要更新的对象。

是执行此功能的代码段
 return getPostsForDate.get().then(snapshot => {
        const updates = {}
        var counter = 0
        const batch = admin.firestore().batch()
        snapshot.forEach((doc) => {

            var key = doc.id
            return admin.database().ref('/convoID/' + key).once('value', (snapshot) => {
                if (snapshot.exists()) {
                    const convoIDCollection = snapshot.val()
                    for (var child in convoIDCollection) {

                        console.log(child)
                        updates["conversations/" + child] = null
                        updates["messages/"+ child] = null
                        updates["convoID/"+ child] = null
                    }
                }
                updates["/convoID/" + key] = null
                updates["/reveals/" + key] = null
                updates["/postDetails/" + key] = null
                const postFireStoreRef = admin.firestore().collection('posts').doc(key)
                const posterRef = admin.firestore().collection('posters').doc(key)
                batch.delete(postFireStoreRef)
                batch.delete(posterRef)
                counter++
                console.log(counter)
             })

        })
        if (counter > 0) {
            console.log("at the deletion point")
              return Promise.all[admin.database().ref().update(updates), batch.commit()] 
        }
        else {
            console.log("null")
            return null
        }
})

基本上,在Firestore查询帖子之后,会从实时数据库接收其他详细信息并将其添加到数组中。最后,我通过承诺提交所有这些更新。但是,从不返回返回更新的函数-为了确保需要对数据库进行更新,我有一个计数器来对更新次数进行计数。如果大于0,我返回

 return Promise.all[admin.database().ref().update(updates), batch.commit()]

但是,好像返回函数是在接收到其他详细信息之前执行的,因为它一直在向控制台日志返回“空”,只有在计数器小于0时才会发生。

本质上,在执行更新之前,如何等待数据被查询?

更新

    return getPostsForDate.get().then(snapshot => {
    const updates = {} 
    const promises = []
    var counter = 0
    const batch = admin.firestore().batch()
    snapshot.forEach((doc) => {
 promises.push (
        admin.database().ref('/convoID/' + key).once('value', (snapshot) => {
            if (snapshot.exists()) {
                const convoIDCollection = snapshot.val()
                for (var child in convoIDCollection) {
                    updates["conversations/" + child] = null
                    updates["messages/"+ child] = null
                    updates["convoID/"+ child] = null
                }
            }
            updates["/convoID/" + key] = null
            updates["/reveals/" + key] = null
            updates["/postDetails/" + key] = null
            const postFireStoreRef = admin.firestore().collection('posts').doc(key)
            const posterRef = admin.firestore().collection('posters').doc(key)
            batch.delete(postFireStoreRef)
            batch.delete(posterRef)
            counter++
         })
        )
    })
    Promise.all(promises).then(() => {
    if (counter > 0) {
        console.log("at the deletion")
          return Promise.all[admin.database().ref().update(updates), batch.commit()] 
    }
    else {
        console.log("null")
        return null
    }
})
})
})

1 个答案:

答案 0 :(得分:1)

admin.database().ref('/convoID/' + key).once(...)是异步的并返回一个承诺,但是您的代码没有使用这些承诺来等待每个查询完成。这意味着您的代码将在快照迭代之后,计数器更新或添加批处理之前立即移至if / else。

您需要重组代码,以将一次()中的所有诺言收集到一个数组中,使用Promise.all()等待所有诺言得到解决,然后提交批处理。