मैं रीयलटाइम डीबी में एक नोड सुन रहा हूं, और एक मल्टीपाथ अपडेट भेजा जाता है जिसे सुरक्षा नियमों को पारित नहीं करना चाहिए। लिखने के नियमों को पारित करना चाहिए लेकिन मान्य नियमों को नहीं।

फायरबेस कंसोल की जाँच करने पर अपेक्षा के अनुरूप कुछ भी नहीं लिखा जाता है। लेकिन क्लाइंट onChildAdded के साथ नोड्स में से किसी एक को सुनने के लिए भेजा गया डेटा प्राप्त करता है।

क्या यह संभव है कि डेटाबेस के लिए कुछ भी प्रतिबद्ध न हो लेकिन फिर भी क्लाइंट पर ऑन चाइल्ड एडेड ट्रिगर होता है?

मैंने सोचा कि यह संभव नहीं था, लेकिन शायद मुझे नियम सत्यापन + मल्टीपाथ अपडेट के बारे में कुछ याद आ रहा है।

कंसोल पर मुद्रित प्राप्त घटना:

घटना: 'क्वेरीइवेंट' का उदाहरण | event.snapshot: 'डेटा स्नैपशॉट' का उदाहरण | event.snapshot.val: {c: true, m: e3, n: 1} [2021-08-31T18:14:33.230Z] @firebase/डेटाबेस: FirebaseError: PERMISSION_DENIED: अनुमति अस्वीकृत (PERMISSION_DENIED)

भेजा गया डेटा, मैं इस तरह से एक मल्टीपाथ अपडेट कर रहा हूं:

Map<String, dynamic> updateToSend = {};

updateToSend["status/c"] = move.c;
updateToSend["status/n"] = move.n;
updateToSend["moves/${move.n}/n"] = move.n;
updateToSend["moves/${move.n}/m"] = move.m;
updateToSend["moves/${move.n}/c"] = move.c;

await fb.database().ref('games/$gameID').update(updateToSend);

श्रोता:

final movesRef = fb.database().ref("/games/${gameId}/moves");
final streamMoves = movesRef.onChildAdded;

streamMoves.listen((event) {
  print(
      "event: $event | event.snapshot: ${event.snapshot} | val: ${event.snapshot.val()}");
  ...
}
0
chessasuke 1 सितंबर 2021, 22:46

1 उत्तर

सबसे बढ़िया उत्तर

क्लाइंट पर जो एक राइट ऑपरेशन करता है, प्रभावित पथ के श्रोता तुरंत आग लगाते हैं - इससे पहले कि डेटा सर्वर पर भी भेजा जाए। यदि सर्वर द्वारा लेखन को अस्वीकार कर दिया जाता है, तो एसडीके वास्तव में सुलह की घटनाओं को आग लगा देगा ताकि यह सुनिश्चित हो सके कि ऐप को फिर से सही स्थिति में रखा जा सके।

इसलिए: यदि आप onChildRemoved स्ट्रीम को भी सुनते हैं, तो सर्वर द्वारा राइट ऑपरेशन को अस्वीकार करने के बाद आपको वहां एक ईवेंट मिलेगा। इससे आप इसे फिर से UI से हटा सकते हैं। प्रारंभिक स्थानीय घटनाओं को रोकने का कोई तरीका नहीं है।

0
Frank van Puffelen 1 सितंबर 2021, 22:59
स्थानीय क्लाइंट पर होने वाली घटना में सर्वर पर समय का एक अनुमान होता है जो स्थानीय समय और सर्वर के लिए स्थानीय समय की ऑफसेट पर आधारित होता है (जो कि पहली बार कनेक्ट होने पर मापता है)। लेकिन सर्वर कभी भी उस मान को नहीं देखेगा/उपयोग नहीं करेगा, बल्कि इसके बजाय वास्तविक सर्वर-साइड टाइमस्टैम्प का उपयोग करता है जिसे वह सभी क्लाइंट्स को भी भेजता है (जिसमें मूल रूप से मूल्य लिखा गया है)। इसके बाद मूल क्लाइंट को सर्वर-साइड टाइमस्टैम्प दिखाने के लिए अपना UI अपडेट करना चाहिए। दो घटनाओं के बीच का अंतर आमतौर पर बहुत छोटा होता है।
 – 
Frank van Puffelen
3 सितंबर 2021, 21:04
धन्यवाद! हां, मैं इसका परीक्षण कर रहा हूं, और ऐसा लगता है कि प्रत्येक चाल के लिए लगभग 50ms का अंतर है। मुझे लगता है कि मैं देखूंगा कि इसे कैसे सिंक्रनाइज़ किया जाए, धन्यवाद
 – 
chessasuke
3 सितंबर 2021, 21:15
हाँ, 50ms अपेक्षित सीमा के भीतर लगता है। यदि आप केवल स्थानीय UI में ईवेंट से मान दिखाते हैं, तो आपको कोई अतिरिक्त कार्य नहीं करना चाहिए। इस मामले में इसका मतलब है कि आपको child_added (क्लाइंट-साइड अनुमानित टाइमस्टैम्प के साथ स्थानीय स्नैपशॉट के लिए) और child_changed (सर्वर-साइड कन्फर्म टाइमस्टैम्प के साथ अपडेट किए गए स्नैपशॉट के लिए) सुनना होगा। यदि आप ऐसा करते हैं, तो उपयोगकर्ता को अस्थायी रूप से थोड़ा ऑफ टाइमस्टैम्प दिखाई देगा - लेकिन यह आमतौर पर कोई समस्या नहीं है।
 – 
Frank van Puffelen
3 सितंबर 2021, 21:22
महान! मैं अभी कोशिश करूँगा, धन्यवाद!
 – 
chessasuke
3 सितंबर 2021, 21:25