【问题标题】:Why does dictionary child not get removed in Firebase Cloud Functions?为什么字典子项不会在 Firebase Cloud Functions 中被删除?
【发布时间】:2018-10-04 19:12:23
【问题描述】:

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

子节点的所有子节点都被删除,除了字典子节点“坐标”

为什么它没有与其余部分一起被删除?我该怎么做?

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"   } }

【问题讨论】:

  • 你在这里肯定没有正确使用 Promise。此外,在我看来,您可以只查询要删除的事件(基于 endDate 的值),而不是读取每个事件。这将运行得更快,花费更少。

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


【解决方案1】:

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

我对 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
    })
})

【讨论】:

  • 我尝试了代码,但现在它根本没有删除任何内容。前面的代码工作并删除除了嵌套子项(坐标)之外的所有子项,它没有被删除
最近更新 更多