2013-03-01 6 views
9

उदाहरण के लिए, मैं डेटाबेस संरचना निम्नलिखित है के साथ बदल रहे हैं:बताने के लिए कैसे जो वंश पर ("child_changed")

/ 
+ users 
    + 1 
    + items 
     + -xxx: "hello" 
    + 2 
    + items 

फिर;

var usersRef = new Firebase("https://mydb.firebaseio.com/users"); 
usersRef.on("child_changed", function(snapshot) { 
    utils.debug(JSON.stringify(snapshot.exportVal())); 
}); 

एक मूल्य, "दुनिया", "/ उपयोगकर्ताओं/1/आइटम" पर धक्का दे दिया गया है, तो मैं मिल सकता है:

{"items": {"-xxx": "hello", "-yyy": "world"}} 

तो, कैसे बताने के लिए जो एक बदल गया है?

मुझे "/ user/$ id/items" के लिए प्रत्येक एकल रेफरी ("child_added") पर जाने की आवश्यकता है?

नोट: मैं node.js. में एक व्यवस्थापक प्रक्रिया लिखने की कोशिश कर रहा हूं।

+0

आपका "मैं प्राप्त कर सकता हूं" जो ऊपर दिखाया गया है उससे मेल नहीं खाता है; आपके पास "आइटम" हैं: {"1": {"आइटम" ', इसके अतिरिक्त, आप 'child_changed' के लिए उपयोगकर्ताओं को सुनकर उस परिणाम को प्राप्त नहीं कर पाएंगे; आपको ऐसा कुछ मिल जाएगा: '{" आइटम: {....}} ' – Kato

+0

मैंने तय किया कि" मुझे मिल सकता है "। धन्यवाद। – hiroshi

उत्तर

22

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

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

तो, आपके उदाहरण के लिए, आप हर बार एक नया आइटम किसी भी उपयोगकर्ता के लिए जोड़ा जाता है अलर्ट पाएं करना चाहते हैं, तुम कर सकते हो निम्नलिखित:

var usersRef = new Firebase("https://mydb.firebaseio.com/users"); 
usersRef.on("child_added", function(userSnapshot) { 
    userSnapshot.ref().child("items").on("child_added", function(itemSnapshot) 
    utils.debug(itemSnapshot.val()); 
    }); 
}); 

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

यह वही ग्राहक कोड लग सकता है की तरह है:।

var itemRef = new Firebase("https://mydb.firebaseio.com/users/MYID/items"); 
var serverEventQueue = new Firebase("https://mydb.firebaseio.com/serverEvents"); 
itemRef.push(newItem); 
serverEventQueue.push(newItem); 

फिर आप सर्वर है कि कतार पर child_added के लिए सुनने और घटनाओं को संभाल सकता है जब वे में आते हैं

+0

धन्यवाद एंड्रयू। मुझे एक झलक मिली कि 'ऑन()' हैंडलर कैसे काम करता है मैं अब के लिए पहले दृष्टिकोण के साथ जाऊंगा, और एक अवसर के लिए दूसरे का उपयोग कर सकता हूं। – hiroshi

+1

देखें! अब आपको 'userSnapshot.ref()' – MasterScrat

+0

के बजाय 'userSnapshot.ref' का उपयोग करना चाहिए धन्यवाद एंड्रयू, मुझे लगता है कि यह मुझे जिस दिशा में जाना है और यह पोस्ट बहुत उपयोगी है। – Lucy

4

एंड्रयू ली एक दिया अच्छा जवाब है, लेकिन मुझे लगता है कि आपको क्लाउड फ़ंक्शंस का उपयोग करने का प्रयास करना चाहिए। इस तरह कुछ काम करना चाहिए:

exports.getPath = functions.database.ref('/users/{id}/items/{itemId}') 
.onWrite(event => { 
    // Grab the current value of what was written to the Realtime Database. 
    const original = event.data.val(); 
    console.log('user id', event.params.id); 
    console.log('item id', event.params.itemId); 
}); 
+0

धन्यवाद भी यर्नर। मैं निकट भविष्य में क्लाउड फ़ंक्शंस में जाऊंगा और यदि मैं सफल हूं तो यहां अपडेट हो जाएगा। वाइल्डकार्डिंग केवल मुझे चाहिए। – Lucy

+0

@ यर्नर, "रेफरी ('/ उपयोगकर्ता/{आईडी}/आइटम/{itemId}')" डेटाबेस संदर्भ एपीआई के लिए संरचना कार्य करते हैं? (यानी, गैर क्लाउड फ़ंक्शन एपीआई) – bernatfortet

+0

@bernatfortet, मुझे ऐसा नहीं लगता है, क्योंकि यह क्लाउड फ़ंक्शंस का बिंदु है। उनके पास विशेषताएं हैं जिनका उपयोग आप अपने बैकएंड पर कर सकते हैं। –

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