我想删除用户的消息,但它删除所有用户

时间:2019-05-17 11:10:18

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

这是我的firebase实时数据库。

enter image description here

我想删除“完成”标签。但是代码正在删除所有用户。工作不正常。我哪里出错了。 我使用的代码

    const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp({
  credential: admin.credential.applicationDefault(),
  databaseURL: 'https://xxxx.firebaseio.com/'
});


/**
 * @function HTTP trigger that, when triggered by a request, checks every message of the database to delete the expired ones.
 * @type {HttpsFunction}
 */
exports.removeOldMessages = functions.https.onRequest((req, res) => {
    const timeNow = Date.now();
    const usersRef = admin.database().ref('/users');
    usersRef.once('value', (snapshot) => {
        snapshot.forEach((child) => {
            if ((Number(child.val()['complete'])) <= timeNow) {
                child.ref.set(null);
            }
        });
    });
    return res.status(200).end();
});

1 个答案:

答案 0 :(得分:0)

上面André的评论向您展示了如何删除complete节点,而不是其父节点。

但是,您的Cloud Function代码未考虑您需要等待异步任务的事实(对set(null)的所有调用,这返回一个Promise,该Promise“在写入服务器时完成”)以完成操作,然后再发送回return res.status(200).end();的响应。

如果您不这样做,则您的Cloud Function可能会在完成异步任务之前完成(并且某些complete节点可能不会被删除)。您将在Firebase视频系列的前两个视频中找到有关“ JavaScript承诺”的一些详细说明:https://firebase.google.com/docs/functions/video-series/

因此,由于需要等待异步set()任务返回的所有Promise解析,因此需要使用Promise.all并按如下所示修改代码:

exports.removeOldMessages = functions.https.onRequest((req, res) => {
    const timeNow = Date.now();
    const usersRef = admin.database().ref('/users');

    usersRef.once('value')
    .then(snapshot => {
        const promises = [];
        snapshot.forEach((child) => {
            if ((Number(child.val()['complete'])) <= timeNow) {
                promises.push(child.ref.child('complete').set(null));
            }
        });
        return Promise.all(promises);
    })
    .then(results => {
        return res.status(200).end();
    })
    .catch(error => {
        //Watch the official video https://www.youtube.com/watch?v=7IkUgCLr5oA
    })
});