Дважды сработала облачная функция Firebase HTTPS

Я прочитал справочник Firebase Cloud Functions, руководства и пример кода, чтобы попытаться определить, почему моя функция сработала дважды, но пока не нашел успешного разрешения. Я также опробовал Firebase-Queue в качестве обходного пути, однако его последнее обновление предлагает способ Cloud Functions.

Короче говоря, я извлекаю уведомления из внешнего API, используя request-promiseпроверка этих уведомлений по сравнению с теми, которые у меня уже есть в моей базе данных, и при обнаружении нового уведомления, отправка их в указанную базу данных. Соответствующее место обновляется со ссылкой на новое уведомление. Код выглядит следующим образом:

'use strict';

const functions = require('firebase-functions');
const admin = require('firebase-admin');
const request = require('request');
const rp = require('request-promise');

admin.initializeApp(functions.config().firebase);

const db = admin.database();
const venues = db.ref("/venues/");

exports.getNotices = functions.https.onRequest((req, res) => {
    var options = {
        uri: 'https://xxxxx.xxxxx',
        qs: {
            format: 'json',
            type: 'venue',
            ...
        },
        json: true
    };
    rp(options).then(data => {
            processNotices(data);
            console.log(`venues received: ${data.length}`);
            res.status(200).send('OK');
        })
        .catch(error => {
            console.log(`Caught Error: ${error}`);
            res.status(`${error.statusCode}`).send(`Error: ${error.statusCode}`);
    });
});

function processNotices(data) {
    venues.once("value").then(snapshot => {
        snapshot.forEach(childSnapshot => {
            var existingKey = childSnapshot.val().key;
            for (var i = 0; i < data.length; i++) {
                var notice = data[i];
                var noticeKey = notice.key;
                if (noticeKey !== existingKey) {
                    console.log(`New notice identified: ${noticeKey}`)
                    postNotice(notice);
                }
            }
            return true;
        });
    });
}

function postNotice(notice) {
    var ref = venues.push();
    var key = ref.key;
    var loc = notice.location;
    return ref.set(notice).then(() => {
        console.log('notice posted...');
        updateVenue(key, loc);
    });
}

function updateVenue(key, location) {
    var updates = {};
    updates[key] = "true";
    var venueNoticesRef = db.ref("/venues/" + location + "/notices/");
    return venueNoticesRef.update(updates).then(() => {
        console.log(`${location} successfully updated with ${key}`);
    });
}

Будем весьма благодарны за любые предложения относительно того, как исправить двойной запуск. Заранее спасибо!

1 ответ

Решение

Проблема решена - некоторая дезинформация из журналов консоли Firebase (повторяющиеся записи) в сочетании с вложенными for петли в неправильном порядке были ответственны за очевидное двойное срабатывание.

Другие вопросы по тегам