0

Ich habe die Firebase Cloud-Funktionen reference, guides und sample code gelesen, um herauszufinden, warum meine Funktion zweimal ausgelöst wird, aber noch eine erfolgreiche Lösung zu finden. Ich habe auch Firebase-Queue als Work-Around getestet, aber das neueste Update schlägt vor, Cloud-Funktionen ist der Weg zu gehen.Firebase HTTPS Cloud-Funktion zweimal ausgelöst

Kurz gesagt, ich rufe Nachrichten von einer externen API unter Verwendung request-promise ab, überprüfend diese Nachrichten gegen diejenigen, die ich bereits in meiner Datenbank habe, und wenn eine neue Nachricht identifiziert wird, posten sie in besagter Datenbank. Der entsprechende Veranstaltungsort wird dann mit einem Verweis auf die neue Benachrichtigung aktualisiert. Code ist wie folgt:

'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}`); 
    }); 
} 

Irgendwelche Vorschläge, wie die Doppelauslösung zu beheben wäre sehr dankbar. Danke im Voraus!

+0

Wie rufen Sie es so auf, dass es nur einmal ausgeführt werden sollte? Was zeigen die Protokolle? –

+0

Beachten Sie auch, dass Sie asynchrone Datenbank arbeiten, ohne darauf warten zu müssen, dass sie in processNotices() abgeschlossen wird. Es sollte ein Versprechen zurückgeben, damit der Anrufer wissen kann, wann die Datenbank vollständig fertig ist, bevor er eine Antwort an den Client sendet. –

+0

Danke für die Aufforderungen, @DougStevenson. Ich habe eine Lösung gefunden (siehe unten). – donovki

Antwort

0

Problem gelöst - einige Fehlinformationen aus den Firebase Console Logs (wiederholende Einträge), zusammen mit verschachtelten for Loops in der falschen Reihenfolge, waren verantwortlich für die scheinbare Doppelauslösung.

Verwandte Themen