Функция Firebase не удалит ребенка после определенного времени - PullRequest
0 голосов
/ 15 февраля 2020

Я хочу удалить ребенка через определенное время. Я знаю, что вам нужна функция Firebase, чтобы добиться этого. Это то, что я получил до сих пор:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();

exports.removeOldMessages = functions.https.onRequest((req, res) => {
    const timeNow = Date.now();
    const Ref = admin.database().ref('/Feed');
    Ref.once('value', (snapshot) => {
        snapshot.forEach((child) => {
            if (1000*(Number(child.val()['timestamp']) + Number(child.val()['duration'])) >= timeNow) {
               child.ref.set(null);
            }
        });
    });
    return res.status(200).end();
});

Я хочу удалить ребенка, когда продолжительность больше (продолжительность в секундах). Это моя структура: Firebase Structure

Спасибо!

1 Ответ

0 голосов
/ 15 февраля 2020

Вы отправляете ответ вызывающей стороне в конце функции, которая будет выполнена до возвращения данных из базы данных. И Cloud Functions перестанут выполнять ваш код сразу после этого res.status(200).end(), поэтому очистка базы данных никогда не произойдет.

Чтобы предотвратить это, отправляйте ответ вызывающей стороне только после того, как все данные будут удалены из базы данных:

exports.removeOldMessages = functions.https.onRequest((req, res) => {
    const timeNow = Date.now();
    const Ref = admin.database().ref('/Feed');
    return Ref.once('value', (snapshot) => {
        let updates = [];
        snapshot.forEach((child) => {
            if (1000*(child.val().timestamp + child.val().duration) >= timeNow) {
               updates[child.key] = null;
            }
        });
        return Ref.update(updates).then(() => {
            return res.status(200).end();
        });
    });
});

Я настоятельно рекомендую хранить дополнительное свойство в ваших дочерних узлах, с предварительно рассчитанным значением timestamp + duration. Имея такое свойство, вы можете запустить запрос на узлах, срок действия которых истек, вместо необходимости читать все дочерние узлы и затем фильтровать их в коде.

Пример этого см. В моем ответе на Удалите данные из базы данных старше 2 часов и пример Облачных функций , основанный на этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...