2016-06-02 9 views
7

लॉग इन करने के बाद, मैं कुछ फ़ायरबेस रीफ की सदस्यता लेता हूं, और उसके बाद लॉगआउट (FirebaseAuth.logout)। एक बार जब मैं लॉगआउट करता हूं, तो मुझे कंसोल में फायरबेस चेतावनी मिलती है: "उपयोगकर्ता कॉलबैक द्वारा अपवाद फेंक दिया गया था। त्रुटि: अनुमति_नहीं ...." और यह एक वास्तविक अपवाद बन जाता है। जबकि मैं इस व्यवहार को देखने की उम्मीद करता हूं, उपयोगकर्ता को लॉग आउट करने के लिए सर्वोत्तम प्रथाएं क्या हैं इसलिए मुझे यह चेतावनी/अपवाद नहीं दिख रहा है?Angularfire2: लॉगआउट अपवाद और सर्वोत्तम प्रथाओं

+0

यह एक अच्छा सवाल है और यह दुर्भाग्यपूर्ण है कि कोई भी किसी भी जानकारी प्रदान की गई है। –

उत्तर

8

मुझे एक ही समस्या थी। निम्नलिखित स्रोत के माध्यम से, मुझे अभी तक एक समाधान मिला है, जिसके साथ मैं अभी तक संतुष्ट नहीं हूं। Source 1

समस्या इस तथ्य में अंतर्निहित है कि अभी भी आपके कोड में खुली, सदस्यता नहीं है, सदस्यता (फायरबेस के कनेक्शन) कहीं भी है।

उदाहरण के लिए मैं

this.name_sub = this.af.database.object("https://stackoverflow.com/users/" + user.uid + "/name") 
    .subscribe(data => { 
    this.globals.user.name = data.$value; 
    } 
); 

कौन सा पूरी तरह से ठीक है, बिंदु आप this.af.auth.logout(); लागू कर रहे हैं जब तक नहीं किया। अगर आपको अपनी फायरबेस सुरक्षा सेटिंग्स सही मिलती हैं, तो फ़ायरबेस एक त्रुटि फेंक देगा, क्योंकि अब आप उपयोगकर्ता के साथ लॉग इन नहीं हैं - अब आप अज्ञात हैं, जिन्हें उपयोगकर्ता स्थान के अंदर अवरुद्ध किया जाना चाहिए। और क्योंकि उपर्युक्त सदस्यता अभी भी सक्रिय है, फ़ायरबेस आपको बताता है कि आपके पास लक्षित उपयोगकर्ता स्थान पर अज्ञात के साथ पहुंच नहीं है।

इसलिए, सदस्यता बंद होनी चाहिए। एक तरीका यह है कि आप यह कर सकते हैं,

ngOnDestroy(){ 
    this.name_sub.unsubscribe(); 
} 

आपके घटक में कहीं भी जोड़ रहा है। यह आपकी सदस्यता को बंद कर देगा जब आपका component is destroyed। दुर्भाग्यवश मेरे लिए यह संभव नहीं है, क्योंकि मैं किसी अन्य घटक में लॉगआउट कर रहा हूं। जिस तरह से मैं इसे कर रहा हूं अब मूल्य प्राप्त करने के बाद, सदस्यता बंद कर रहा है।

this.name_sub = this.af.database.object("https://stackoverflow.com/users/" + user.uid + "/name") 
    .subscribe(data => { 
    this.globals.user.name = data.$value; 
    this.name_sub.unsubscribe(); // <-- important part 
    } 
); 

मेरे लिए, यह सुपर काउंटर-अंतर्ज्ञानी है। मुझे लगता है कि हमें डेटा चैनल को स्थायी सदस्यता के बिना और अतिरिक्त मॉड्यूल आयात किए बिना मूल्य (ओं) प्राप्त करने का एक तरीका चाहिए।

+0

यह सही जवाब है; सभी सदस्यता को लॉग आउट करने से पहले सदस्यता समाप्त करने की आवश्यकता है। आम तौर पर यह निकलस द्वारा इंगित एनजीओएनडीस्ट्रॉय में किया जाता है, और मेमोरी लीक से बचने के लिए वैसे भी सबसे अच्छा अभ्यास है –

+0

लॉग आउट करने से पहले सबकुछ सदस्यता समाप्त करने का कोई तरीका है? मुझे बस सभी सब्सक्रिप्शन ढूंढना बहुत कठिन लगता है और भविष्य में इसे भूलना भी बहुत आसान है। – alltej

0

यह बदसूरत है, लेकिन काम करता है:

signOut(): void { 
    this.router.navigate(['/app').then(() => { 
     firebase.database().goOffline()  // <=== this eliminates error! 
     this.afAuth.auth.signOut() 
    }) 
    } 
+1

कृपया बताएं कि कोड क्यों काम करता है। –

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