为什么未在Firebase Cloud Functions中删除字典子项?

时间:2018-10-04 10:14:14

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

我在Cloud Functions中有一个结构,我在其中遍历每个孩子,然后查看其(endDate)值是否已超过当前时间,然后删除过期的孩子

删除所有子节点的子节点,但字典子节点“ coordinate”除外

为什么它不能与其余的一起去除?我该怎么办?

exports.removeOldMessages = functions.https.onRequest((req, res) => {
    const messagesRef = admin.database().ref('events')
    messagesRef.once('value', (snapshot) => {
        snapshot.forEach((child) => {
            child.forEach((child) => {
                if (Number(child.val()['endDate']) <= new Date().getTime()) {
                   child.ref.set(null)
              }
            })
        })
    })
    return res.status(200).end()
})

这是JSON

{   "events" : { "N5iTuYzAbJa02RauxCl3uh2Nggz1" : {  
"-LNmIvSdrwK96KCGcmXm" : {
    "addedBy" : "Riyadh Figures",
    "coordinate" : [ 24.70914690943994, 46.78851541131735 ],
    "endDate" : "1538442801.0",
    "imagePath" : "-LNmIvSdrwK96KCGcmXm",
    "key" : "-LNmIvSdrwK96KCGcmXm",
    "title" : "hjihgf",
    "userPicture" : "N5iTuYzAbJa02RauxCl3uh2Nggz1"   } }

1 个答案:

答案 0 :(得分:0)

once函数返回一个回调,您将在此之后立即退出,因此它可能在返回记录之前就退出了。另外,ref.set返回一个承诺,并且您没有等待它,因此您还需要等待其完成后才能退出。

我对Realtime DB的经验不足,但是等待操作完成可能会起作用:

exports.removeOldMessages = functions.https.onRequest((req, res) => {
    const messagesRef = admin.database().ref('events')
    messagesRef.once('value', (snapshot: DataSnapshot) => {
        let promises = []; // Creates an array to hold the promises
        snapshot.forEach((snap) => {
            snap.forEach((child) => {
                if (Number(child.val()['endDate']) <= new Date().getTime()) {
                   promises.push(child.ref.set(null)) // Add each promise which will then be waited
              }
            })
        })
        Promise.all(promises).then(() => res.status(200).end()); // Wait for all promises to finish before completing
    })
})