Я хочу удалить сообщения пользователей, но он удаляет всех пользователей - PullRequest
0 голосов
/ 17 мая 2019

Это моя база данных 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 голосов
/ 17 мая 2019

В приведенном выше комментарии Андре показано, как удалить узел complete, а не его родительский элемент.

Однако ваш код облачной функции не учитывает тот факт, что вынеобходимо дождаться завершения асинхронных задач (все вызовы set(null), который возвращает Promise, который «разрешается после завершения записи на сервер»), прежде чем отправить ответ с return res.status(200).end();,

Если вы этого не сделаете, ваша облачная функция может завершить до того, как будут выполнены асинхронные задачи (и некоторые complete узлы могут быть не удалены).В первых двух видеороликах о «Обещаниях JavaScript» из серии видеороликов Firebase вы найдете несколько подробных объяснений: https://firebase.google.com/docs/functions/video-series/

Итак, вам нужно подождать, пока все Обещания возвращаются асинхронными set() задачами.решить, вам нужно использовать 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
    })
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...