Доступ ко всем дочерним узлам и обновление их для функции Firebase - PullRequest
0 голосов
/ 04 ноября 2018

Я обнаружил некоторую рекурсию на одном из узлов моей базы данных реального времени, и я хочу удалить (или установить null) этот конкретный узел. Пока это моя функция firebase:

exports.cleanForms = functions.https.onRequest((req, res) => {
    const parentRef = admin.database().ref("forms");
    return parentRef.once('value').then(snapshot => {
        snapshot.forEach(function(child) {
            admin.database().ref('forms/'+child.key+'/user/forms').set(null);
        });
    });
});

По сути, он должен перебрать все записи внутри узла формы и удалить его свойство user / forms.

Но вызов этой функции, перейдя по этому адресу: https: //.cloudfunctions.net/cleanForms, дает мне эту ошибку:

Ошибка: не удалось обработать запрос

И вот что я вижу в логах:

10: 47: 57.818 PM cleanForms Выполнение функции заняло 13602 мс, завершено со статусом: «ошибка соединения»

Узел форм имеет менее 3000 записей, но, как я упоминал ранее, он имеет некоторую рекурсию. Я не знаю, происходит ли сбой из-за его размера или что-то связанное с этим.

1 Ответ

0 голосов
/ 04 ноября 2018

Вы используете облачную функцию HTTP: поэтому вы должны"отправить ответ клиенту в конце" (Смотрите это официальное видео Дуга Стивенсона для более подробной информации: https://youtu.be/7IkUgCLr5oA).

В вашем случае, «конец» функции будет тогда, когда ВСЕ ваши асинхронные операции set () будут «выполнены». Поскольку метод set() возвращает Promise, вы должны использовать Promise.all() (снова посмотрите это официальное видео: https://youtu.be/d9GrysWH1Lc).

Таким образом, должно работать следующее (однако не проверено):

exports.cleanForms = functions.https.onRequest((req, res) => {
    const parentRef = admin.database().ref("forms");
    parentRef.once('value')
    .then(snapshot => {
        const promises = [];
        snapshot.forEach(child => {
           promises.push(admin.database().ref('forms/'+child.key+'/user/forms').set(null));
        });
        return Promise.all(promises)   
    .then(results => {
        response.send({result: results.length + ' node(s) deleted'});
    })
    .catch(error => {
        response.status(500).send(error);
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...