2017-03-16 14 views
5

लागू मैं सिर्फ बादल कार्यों के लिए मेरी firebase-queue कार्यकर्ताओं पर ले जाने के प्रयास में Firebase के लिए बादल कार्य बाहर कोशिश कर रहा हूँ। जब भी मैं किसी दिए गए रेफरी पर नया नोड बनाता हूं तो मैंने अंतिम अद्यतन टाइमस्टैम्प जोड़ने के लिए एक सरल फ़ंक्शन जोड़ा। फ़ंक्शन इस तरह दिखता है:बादल कार्य कई बार

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()); 
    }); 

मैंने इस क्लाउड फ़ंक्शन को तैनात किया और मेरे ऐप से केवल एक नोड जोड़ा। मैं फायरबेस फ़ंक्शन डैशबोर्ड पर गया और देखा कि फ़ंक्शन को 16 9 बार बुलाया गया है और मुझे नहीं पता कि क्यों। जब मैं लॉग देखता हूं, तो मुझे सभी पिछले नोड्स में फ़ंक्शन को अटैच करने जैसे लॉग दिखाई देते हैं।

क्या यह मामला है कि onWritechild_added की तरह व्यवहार करेगा और सभी मौजूदा इकाइयों के लिए भी कार्य करेगा?

इस कार्रवाई हर बार जब मैं बदल सकते हैं और समारोह फिर से तैनात दोहराया जा सकते हैं?

मैं यह सिर्फ नए जोड़े गए नोड के लिए एक बार चलाने के लिए उम्मीद कर रहा था।

+0

उत्तर के लिए उत्तर –

उत्तर

5

डेटाबेस लिखने वाले कार्यों को लिखते समय यह एक आम गलती है। जब आप किसी स्थान पर प्रारंभिक लेखन के लिए ईवेंट को संभालते हैं, तो उसी स्थान पर दूसरी बार लिखें, कि दूसरा लेखन फिर से एक और ईवेंट ट्रिगर करेगा जो फ़ंक्शन को फिर से चलाएगा, और इसी तरह, जो एक अनंत लूप होगा।

आप अपने समारोह में कुछ तर्क अगर दूसरा लिखने घटना डेटाबेस को फिर से लिखना चाहिए निर्धारित करता है कि जरूरत है। वह लूप को रोक देगा। आपके मामले में, आपको अंतिम अद्यतन समय सेट करने के लिए फ़ंक्शन की आवश्यकता नहीं है। सर्वर को वर्तमान समय को फ़ील्ड में डालने के लिए सर्वर को एक विशेष मूल्य के साथ ऐसा कर सकते हैं।

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

+0

उत्तर के लिए धन्यवाद। इस तरह के आखिरी अद्यतन टाइमस्टैम्प को अपडेट करना वास्तव में ऐसा कुछ नहीं था जिसे मैं करना चाहता हूं लेकिन क्लाउड फ़ंक्शंस को आजमाने के लिए मैंने जो कुछ सोचा था, वह कुछ ऐसा नहीं था। –

+0

यह उचित है - स्वचालित रूप से उस तरह के मान अपडेट करना निश्चित रूप से एक उपयोग केस है। कभी-कभी उस समाप्ति मामले में कोड सुनिश्चित करने के लिए मुश्किल हो सकता है। :-) –

+0

हाँ, मुझे खुशी है कि जब मैंने यह गलती की थी तो मैं एक भुगतान योजना पर नहीं था। :) मुझे नहीं पता कि मुझे कितना शुल्क लिया जाएगा। मैंने इसे रातोंरात चलाना छोड़ दिया और मैं फ़ंक्शन कंसोल पर कई लॉग देख सकता हूं जो फ़ंक्शन का आह्वान नहीं कर सकता क्योंकि कोटा पहुंच गया है। –

8

डौग सही है। इसके अतिरिक्त, यह जानना अच्छा हो सकता है कि यदि आपके पास अनंत लूप में फंसे हुए फ़ंक्शन हैं, तो इसे रोकने के लिए जिस तरीके से लूप के लिए फ़िक्स के साथ अपने फ़ंक्शन को पुन: नियोजित करना है (firebase deploy का उपयोग करना) या फ़ंक्शन को पूरी तरह से हटाने के लिए (इसे अपने index.js से हटाकर और firebase deploy चलाकर)।

+1

क्लाउड फ़ंक्शन को रोकने पर टिप के लिए धन्यवाद। –

+2

वास्तव में उम्मीद है कि भविष्य में व्यवस्थापक पोर्टल के माध्यम से कार्यों को अक्षम करने का एक तरीका है .. :) – mtb

+1

फ़ीचर अनुरोध नोट किया गया, धन्यवाद! :) –

संबंधित मुद्दे