2017-03-16 14 views
5

Próbuję tylko funkcji Cloud dla Firebase, aby przenieść moich pracowników do funkcji chmurowych. Dodałem prostą funkcję, aby dodać ostatni zaktualizowany znacznik czasu, ilekroć utworzę nowy węzeł pod danym ref. Funkcja wygląda następująco:Funkcje chmury dla Firebase wielokrotnie wywoływane

var functions = require('firebase-functions'); 
const admin = require('firebase-admin'); 

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

exports.setLastUpdatedTimestamp = functions.database.ref('/nodes/{nodeId}') 
    .onWrite(event => { 
    const original = event.data.val(); 
    console.log('Adding lastUpdatedTimestamp to node ', original.name); 
    return event.data.ref.child('lastUpdatedAtFromFC').set(Date.now()); 
    }); 

Zainstalowałem tę funkcję chmury i dodałem tylko jeden węzeł z mojej aplikacji. Poszedłem do pulpitu funkcji Firebase Functions i widziałem, że funkcja została wywołana 169 razy i nie mam pojęcia dlaczego. Kiedy patrzę na logi, widzę dzienniki takie jak dołączanie funkcji do wszystkich poprzednich węzłów.

Czy jest tak, że onWrite zachowałoby się w stylu child_added i uruchomił także funkcję dla wszystkich istniejących obiektów?

Czy ta czynność zostanie powtórzona za każdym razem, gdy zmienię i ponownie uruchomię funkcję?

Spodziewałem się, że uruchomi się tylko raz dla nowo dodanego węzła.

+0

Sprawdź odpowiedzi poniżej –

Odpowiedz

5

Jest to powszechny błąd podczas pisania funkcji dotyczących zapisywania baz danych. Kiedy zajmujesz się zdarzeniem dla początkowego zapisu w danej lokalizacji, to zróbmy sekundę zapisu wstecz do tej samej lokalizacji, aby ten drugi zapis wywołał kolejne zdarzenie, które uruchomi funkcję ponownie, i tak dalej, co będzie nieskończoną pętlą.

Potrzebujesz pewnej logiki w swojej funkcji, która określa, czy drugie zdarzenie zapisu nie powinno być ponownie zapisywane w bazie danych. To zatrzyma pętlę. W twoim przypadku nie potrzebujesz funkcji, aby ustawić czas ostatniej aktualizacji. Możesz to zrobić za pomocą specjalnej wartości na kliencie, aby nakazać serwerowi wstawienie bieżącego czasu do pola.

https://firebase.google.com/docs/reference/js/firebase.database.ServerValue#.TIMESTAMP

+0

Dziękujemy za odpowiedź. Aktualizowanie ostatnio zaktualizowanego znacznika czasu nie było tak naprawdę czymś, co zamierzam zrobić, ale po prostu czymś, co moim zdaniem przydałoby się wypróbować funkcje chmury. –

+0

To prawda - automatyczne aktualizowanie takich wartości jest zdecydowanie użyteczne. To może być czasami trudne, aby upewnić się, że kod w tym przypadku zakończenia. :-) –

+0

Tak, jestem po prostu szczęśliwy, że nie miałem płatnego planu, kiedy popełniłem ten błąd. :) Nie wiem, ile zostałbym obciążony. Zostawiłem to na noc i widziałem wiele logów na konsoli funkcji, które nie mogą wywoływać funkcji, ponieważ przydział został osiągnięty. –

8

Doug jest poprawna. Dodatkowo może być dobrze wiedzieć, że jeśli masz funkcję zablokowaną w nieskończonej pętli, sposobem na jej zatrzymanie jest ponowne wdrożenie funkcji (za pomocą firebase deploy) z poprawką do pętli lub całkowite usunięcie tej funkcji (poprzez usunięcie go ze swojego index.js i uruchomienie firebase deploy).

+1

Dzięki za podpowiedź o zatrzymaniu funkcji chmury. –

+2

Naprawdę mam nadzieję, że istnieje sposób na wyłączenie funkcji za pośrednictwem portalu administratora w przyszłości .. :) – mtb

+1

Żądanie funkcji zauważyć, dzięki! :) –