QuotaExceededError: DOM अपवाद 22: कोटा से अधिक संग्रहण के लिए कुछ जोड़ने का प्रयास किया गया था


219

IOS 7 के साथ iPhone पर लोकलस्टोरेज का उपयोग करना इस त्रुटि को बढ़ाता है। मैं एक रिसोल्वेंट के लिए चारों ओर देख रहा हूं, लेकिन यह देखते हुए कि मैं निजी में भी ब्राउज़ नहीं कर रहा हूं, कुछ भी प्रासंगिक नहीं है।

मुझे समझ नहीं आता कि iOS 7 में लोकलस्टोरेज डिफॉल्ट रूप से डिसेबल क्यों होगा, लेकिन ऐसा लगता है कि यह है? मैंने अन्य वेबसाइटों पर भी परीक्षण किया है, लेकिन कोई भाग्य नहीं है। मैंने इस वेबसाइट का उपयोग करके इसका परीक्षण करने की भी कोशिश की: http://arty.name/localstorage.html , लेकिन ऐसा नहीं लगता है कि यह किसी अजीब कारण के लिए कुछ भी बचा रहा है।

किसी को भी एक ही समस्या थी, केवल वे इसे ठीक करने भाग्य था? क्या मुझे अपनी संग्रहण विधि बदलनी चाहिए?

मैंने केवल सूचनाओं की कुछ पंक्तियों को संग्रहीत करके इसे कठिन-डीबग करने का प्रयास किया, लेकिन कोई फायदा नहीं हुआ। मैंने localStorage.setItem()सहेजने के लिए मानक फ़ंक्शन का उपयोग किया ।


2
आमतौर पर इसका मतलब है कि आपने कुछ आकार स्टोर करने की कोशिश की है जो उपलब्ध संग्रहण स्थान से अधिक है। आप (सफारी, क्रोम, आदि) किस ब्राउज़र का उपयोग कर रहे हैं? क्या आप अपने द्वारा उपयोग किए जा रहे कोड का थोड़ा और हिस्सा साझा कर सकते हैं और यदि संभव हो तो डेटा जो आप स्टोर करने की कोशिश कर रहे हैं।

3
इसे सफारी साइड पर बग या इश्यू माना जाना चाहिए। यह समझ में नहीं आता है कि आप incognito मोड में
लोकलस्टोरीज का

इस विशिष्ट समस्या के लिए परीक्षणों का पता लगाने वाली एक सुविधा का उपयोग करें । यदि संग्रहण उपलब्ध नहीं है, तो मेमोरीस्टोरेज के साथ लोकलस्टोरेज को चमकाने पर विचार करें । अस्वीकरण: मैं लिंक किए गए पैकेजों का लेखक हूं
Stijn de Witt

1
अप्रैल 2017 में एक पैच सफारी में विलय कर दिया गया था, इसलिए इसे अन्य ब्राउज़रों के साथ गठबंधन किया। सफारी में भूमि की संभावना होगी 11. बग़्सवेबकित डॉट ओआरजी_बग.को.गि .1=157010
सैंडस्ट्रॉम

2
मैं इस बात की पुष्टि कर सकता हूं कि सफारी आईओएस 11 में परीक्षण किया गया है। परीक्षण किया गया निजी ब्राउज़िंग + sessionStorage.setItem () तब sessionStorage.getItem () iPhone6 ​​और iPhone8 पर सफलतापूर्वक।
केविन गौडिन

जवाबों:


372

यह तब हो सकता है जब सफारी निजी मोड ब्राउज़िंग में हो। निजी ब्राउज़िंग में, स्थानीय भंडारण बिल्कुल भी उपलब्ध नहीं है।

एक समाधान उपयोगकर्ता को चेतावनी देना है कि ऐप को काम करने के लिए गैर-निजी मोड की आवश्यकता है।

अद्यतन: यह सफारी 11 में तय किया गया है , इसलिए व्यवहार अब अन्य ब्राउज़रों के साथ गठबंधन किया गया है।


4
आपकी पोस्ट आज मेरे लिए बस अविश्वसनीय रूप से उपयोगी और समय पर (24 घंटे से कम समय बाद) थी। संदर्भ के लिए, निजी ब्राउज़िंग चालू / बंद कैसे करें: imore.com/how-use-pStreet-browsing-ios-7-safari
Nick

12
+1 ने मेरा मुद्दा ठीक कर दिया। मैं if( typeof Storage != 'undefined' ) { ... }जानकारी लोड करने और सहेजने की कोशिश करने से पहले लोकलस्टोरेज ( ) के अस्तित्व के लिए जाँच कर रहा था लेकिन यह त्रुटि हो रही है। Storageअनुपयोगी होने पर भी टर्न आउट को परिभाषित किया जाता है। जब भी मैं लोकलस्टोरेज का उपयोग करता हूं, तब से कोशिश / कैच का उपयोग करना।
स्टीवेंडेसु

धन्यवाद! सफारी द्वारा अजीब त्रुटि। अधिक जानकारीपूर्ण होना चाहिए था। : D
सनी आर गुप्ता

2
सफारी टेक प्रिव्यू 29 के अनुसार एक फिक्सिंग आ सकती है: "प्राइवेट ब्राउजिंग मोड या वेबड्राइवर सत्रों में लोकलस्टोरेज में सेव करते समय फिक्स्ड कोटा। डेवलपर
Marc Baumbach

1
यह तब भी हो सकता है यदि भंडारण सीमा तक पहुँच जाता है जो उदाहरण के लिए छवियों को सहेजकर आसानी से किया जा सकता है।
csalmeida

103

जैसा कि अन्य उत्तरों में उल्लेख किया गया है, आपको हमेशा localStorage.setItem(या sessionStorage.setItem) कॉल करने पर iOS और OS X दोनों पर सफारी प्राइवेट ब्राउज़र मोड में QuotaExceededError मिलेगा ।

एक समाधान का उपयोग करने के प्रत्येक उदाहरण में एक कोशिश / पकड़ या आधुनिकीकरण की जाँच करना है setItem

हालाँकि, यदि आप एक ऐसी शिम चाहते हैं, जो विश्व स्तर पर इस त्रुटि को रोकती है, तो अपने जावास्क्रिप्ट को टूटने से रोकने के लिए, आप इसका उपयोग कर सकते हैं:

https://gist.github.com/philfreo/68ea3cd980d72383c951

// Safari, in Private Browsing Mode, looks like it supports localStorage but all calls to setItem
// throw QuotaExceededError. We're going to detect this and just silently drop any calls to setItem
// to avoid the entire page breaking, without having to do a check at each usage of Storage.
if (typeof localStorage === 'object') {
    try {
        localStorage.setItem('localStorage', 1);
        localStorage.removeItem('localStorage');
    } catch (e) {
        Storage.prototype._setItem = Storage.prototype.setItem;
        Storage.prototype.setItem = function() {};
        alert('Your web browser does not support storing settings locally. In Safari, the most common cause of this is using "Private Browsing Mode". Some settings may not save or some features may not work properly for you.');
    }
}

1
यदि आप किसी भी तरह से इसका उपयोग करने में सक्षम नहीं हैं, तो संग्रहण वस्तु में सेट इट को क्यों जोड़ें?
नेक्रोमैन्टर

4
मेरे स्निपेट की बात यह है कि अगर आप चाहते हैं कि जेएस की त्रुटियों को आप नजरअंदाज न करें, तो यदि आप चाहते हैं कि आपका ऐप सफारी प्राइवेट मोड में पूरी तरह से टूट न जाए।
फिल्पेरो

16

मैं इस साधारण फ़ंक्शन का उपयोग करता हूं, जो स्थानीय रिटर्न के लिए परीक्षण करता है trueया false,

isLocalStorageNameSupported = function() {
    var testKey = 'test', storage = window.sessionStorage;
    try {
        storage.setItem(testKey, '1');
        storage.removeItem(testKey);
        return true;
    } catch (error) {
        return false;
    }
}

अब आप localStorage.setItem()इसका उपयोग करने से पहले उपलब्धता के लिए परीक्षण कर सकते हैं । उदाहरण:

if ( isLocalStorageNameSupported() ) {
    // can use localStorage.setItem('item','value')
} else {
    // can't use localStorage.setItem('item','value')
}

क्या मुझे कुछ याद आया? क्यों बुलाया विधि के window.sessionStorageबजाय प्रयोग किया window.localStorageजाता है isLocalStorageNameSupported?
इटार

@lthar - यहां प्रलेखन देखें: w3schools.com/html/html5_webstorage.asp सबसे महत्वपूर्ण बात यह है कि भाग:HTML local storage provides two objects for storing data on the client: window.localStorage - stores data with no expiration date window.sessionStorage - stores data for one session (data is lost when the browser tab is closed)
ड्रू

@ ड्रू, लेकिन अगर आप अपनी परीक्षा कुंजी को हटा देते हैं तो इस स्थिति में क्या अंतर है? इससे कोई फर्क नहीं पड़ता कि मैं अपनी परीक्षण कुंजी को कहाँ संग्रहीत करूँगा यदि मैं इसे हटाने जा रहा हूँ। क्या मै गलत हु? सत्र भंडारण बेहतर क्यों है जो स्थानीय है?
व्लादिस्लाव तुरक

1
@TurakVladyslav आप सही हैं कि वास्तव में यहाँ कोई अंतर नहीं है सिवाय इसके कि इसका उपयोग sessionStorageब्रेकपॉइंट्स की स्थापना के लिए अधिक प्रबंधनीय है यदि आप अपने विकास का परीक्षण करना चाहते हैं। कोई भी सही तर्क नहीं है जिसके लिए "बेहतर" है और यह वास्तव में यहां सिर्फ एक व्यक्तिगत प्राथमिकता है जो सावधानी के साथ गलत है। टिप्पणी करने के लिए मुख्य बात यह है कि दोनों sessionStorageऔर localStorageएचटीएमएल 5 WebStorage एपीआई के दोनों कार्यान्वयन हैं।
DrewT

5

मैं iOS 7 में इसी मुद्दे के साथ चला गया (कुछ उपकरणों के साथ कोई सिमुलेटर नहीं)।

आईओएस 7 में सफारी की तरह दिखता है एक कम भंडारण कोटा है, जो स्पष्ट रूप से एक लंबा इतिहास लॉग होने तक पहुंच गया है।

मुझे लगता है कि अपवाद को पकड़ने के लिए सबसे अच्छा अभ्यास होगा।

मॉडर्निज़्र प्रोजेक्ट में एक आसान पैच है, आपको कुछ इसी तरह की कोशिश करनी चाहिए: https://github.com/Modernizr/Modernizr/blob/master/feature-detects/storage/localstorage.js


3

यहाँ ड्रूइट के उत्तर पर आधारित एक विस्तारित समाधान है जो कि लोकलस्टोरेज उपलब्ध नहीं होने पर कुकीज़ का उपयोग करता है। यह मोज़िला की डॉक्यूकीज़ लाइब्रेरी का उपयोग करता है :

function localStorageGet( pKey ) {
    if( localStorageSupported() ) {
        return localStorage[pKey];
    } else {
        return docCookies.getItem( 'localstorage.'+pKey );
    }
}

function localStorageSet( pKey, pValue ) {
    if( localStorageSupported() ) {
        localStorage[pKey] = pValue;
    } else {
        docCookies.setItem( 'localstorage.'+pKey, pValue );
    }
}

// global to cache value
var gStorageSupported = undefined;
function localStorageSupported() {
    var testKey = 'test', storage = window.sessionStorage;
    if( gStorageSupported === undefined ) {
        try {
            storage.setItem(testKey, '1');
            storage.removeItem(testKey);
            gStorageSupported = true;
        } catch (error) {
            gStorageSupported = false;
        }
    }
    return gStorageSupported;
}

अपने स्रोत में, बस उपयोग करें:

localStorageSet( 'foobar', 'yes' );
...
var foo = localStorageGet( 'foobar' );
...

2

जैसा कि पहले से ही अन्य जवाबों में बताया गया है, जब निजी ब्राउजिंग मोड में सफारी हमेशा डेटा को बचाने की कोशिश करते समय इस अपवाद को फेंक देगी localStorage.setItem()

इसे ठीक करने के लिए मैंने एक फर्जी लोकलस्टोरेज लिखा, जो लोकलस्टोरेज की नकल करता है, दोनों तरीके और इवेंट।

नकली लोकलस्टोरीज: https://gist.github.com/engelfrost/fd707819658f72b42f55

यह शायद समस्या का एक अच्छा सामान्य समाधान नहीं है। यह मेरे परिदृश्य के लिए एक अच्छा समाधान था, जहां विकल्प पहले से मौजूद एप्लिकेशन पर प्रमुख रूप से लिखेंगे।


क्या यह ठीक करता है? यह कुछ भी जारी नहीं रखता है, तो क्या बात है?
एसेन स्कोव पेडरसन

1
यह "फिक्स" सफारी करता है जब निजी ब्राउज़िंग मोड में। (यह मेरे उत्तर में स्पष्ट नहीं है, इस ओर इशारा करने के लिए धन्यवाद। मैं अपना उत्तर संपादित करूंगा)। निजी ब्राउज़िंग मोड में परवाह किए बिना कुछ भी जारी रखने के लिए नहीं माना जाता है, इसलिए नहीं बनाए रखना यहाँ एक प्रासंगिक मुद्दा नहीं है। मेरे लिए यह तय था कि उपयोगकर्ताओं को पहले से ही मौजूद एप्लिकेशन को चलाने की अनुमति दी जाए, बिना प्रमुख री-राइट्स के, तब भी जब सफारी में निजी ब्राउज़िंग मोड में।
जोसेफ एन्गेलफ्रॉस्ट

2

अपडेट (2016-11-01)

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

इसके अलावा, मैंने ऐसे कई उपयोगकर्ताओं पर ध्यान दिया है जो हमेशा iOS सफारी पर निजी मोड में ब्राउज़ कर रहे हैं। उस कारण से, सफारी के लिए एक बेहतर कमबैक कुकीज़ (यदि उपलब्ध हो) का उपयोग करना है। डिफ़ॉल्ट रूप से, कुकीज़ अभी भी निजी ब्राउज़िंग में सुलभ हैं। बेशक, निजी ब्राउज़िंग से बाहर निकलने पर उन्हें हटा दिया जाता है, लेकिन ताज़ा होने पर उन्हें साफ़ नहीं किया जाता है।

मुझे लोकल-स्टोरेज-फ़ॉलबैक लाइब्रेरी मिली । प्रलेखन से:

उद्देश्य

"प्राइवेट ब्राउजिंग" जैसी ब्राउज़र सेटिंग्स के साथ नए विंडो में भी काम करने वाली विंडो.लोकलस्टोरेज पर भरोसा करना एक समस्या बन गई है। हालांकि यह मौजूद हो सकता है, यह setItem या getItem का उपयोग करने की कोशिश करते समय अपवादों को फेंक देगा। यह मॉड्यूल यह देखने के लिए उपयुक्त जाँच चलाएगा कि ब्राउज़र भंडारण तंत्र क्या उपलब्ध हो सकता है, और फिर उसे उजागर करें। यह लोकस्टस्टोरीज के समान एपीआई का उपयोग करता है इसलिए इसे ज्यादातर मामलों में ड्रॉप-इन प्रतिस्थापन के रूप में काम करना चाहिए।

गोचरों से सावधान रहें:

  • कुकीस्टोरीज में स्टोरेज सीमा होती है। यहां सावधान रहें।
  • मैमोरीस्टोरेज पेज लोड के बीच नहीं रहेगा। यह पेज क्रैश को रोकने के लिए कम या ज्यादा स्टॉप-गैप है, लेकिन उन वेबसाइटों के लिए पर्याप्त हो सकता है जो पेज लोड नहीं करते हैं।

टी एल; डॉ:

का प्रयोग करें स्थानीय भंडारण-फ़ॉलबैक (साथ एकीकृत एपीआई .getItem(prop)और .setItem(prop, val)):

ब्राउज़र के लिए उचित भंडारण एडाप्टर की जाँच करें और उसका उपयोग करें (लोकलस्टोरेज, सेशनस्टोर, कुकीज, मेमोरी)

मूल उत्तर

पिछले उत्तरों को जोड़ने के लिए, भंडारण पद्धति को बदलने के लिए एक संभावित समाधान होगा। AmplifyJS और PersistJS जैसे कुछ लिब्रेरीज़ हैं जो मदद कर सकते हैं। दोनों ही काम कई बैकएंड के माध्यम से लगातार क्लाइंट-साइड स्टोरेज की अनुमति देते हैं।

AmplifyJS के लिए

स्थानीय भंडार

  • IE 8+
  • फ़ायरफ़ॉक्स 3.5+
  • सफारी 4+
  • क्रोम
  • ओपेरा 10.5+
  • iPhone 2+
  • Android 2+

sessionStorage

  • IE 8+
  • फ़ायरफ़ॉक्स 2+
  • सफारी 4+
  • क्रोम
  • ओपेरा 10.5+
  • iPhone 2+
  • Android 2+

globalStorage

  • फ़ायरफ़ॉक्स 2+

उपयोगकर्ता का आधार - सामग्री

  • IE 5 - 7
  • userData IE के नए संस्करणों में भी मौजूद है, लेकिन IE 9 के कार्यान्वयन में quirks के कारण, हम localDorage द्वारा समर्थित होने पर उपयोगकर्ताडेटा को पंजीकृत नहीं करते हैं।

स्मृति

  • अन्य स्टोरेज प्रकारों में से कोई भी उपलब्ध नहीं होने पर, इन-मेमोरी स्टोर को फ़ॉलबैक के रूप में प्रदान किया जाता है।

PersistentJS के लिए

  • फ्लैश: फ्लैश 8 लगातार भंडारण।
  • गियर: Google गियर्स-आधारित निरंतर संग्रहण।
  • स्थानीयस्टोरेज: HTML5 ड्राफ्ट स्टोरेज।
  • Globalstorage: HTML5 ड्राफ्ट भंडारण (पुरानी कल्पना)।
  • यानी: इंटरनेट एक्सप्लोरर यूजरडेटा व्यवहार।
  • कुकी: कुकी-आधारित निरंतर भंडारण।

वे एक अमूर्त परत की पेशकश करते हैं ताकि आपको भंडारण प्रकार चुनने के बारे में चिंता न करें। ध्यान रखें कि हालांकि भंडारण प्रकार के आधार पर कुछ सीमाएँ (जैसे आकार सीमाएँ) हो सकती हैं। अभी, मैं AmplifyJS का उपयोग कर रहा हूं, लेकिन मुझे अभी भी iOS 7 / Safari / etc पर कुछ और परीक्षण करना है। यह देखने के लिए कि क्या यह वास्तव में समस्या को हल करता है।


संपादक जॉन: मुझे एहसास है कि आप और जोनाथन अल्जेटा शायद एक ही खाते हैं और आप सिर्फ अपना उत्तर सुधारने की कोशिश कर रहे हैं, लेकिन यदि आपको वास्तव में जोनाथन अल्जेटा के रूप में लॉग-इन करना चाहिए और इस उत्तर को संपादित करना चाहिए, और तब यह नहीं होगा समीक्षा कतार। यदि आपको आवश्यकता हो तो अपना खाता पुनः प्राप्त करें।
डेविड नोव

1

अप्रैल 2017 में एक पैच सफारी में विलय कर दिया गया था, इसलिए इसे अन्य ब्राउज़रों के साथ गठबंधन किया। यह सफारी 11 के साथ जारी किया गया था।

https://bugs.webkit.org/show_bug.cgi?id=157010


0

इस सवाल और जवाब ने मुझे पार्स में नए उपयोगकर्ताओं को साइन अप करने के साथ एक विशेष समस्या को हल करने में मदद की।

क्योंकि साइनअप (attrs, विकल्प) फ़ंक्शन सत्र को जारी रखने के लिए स्थानीय भंडारण का उपयोग करता है, यदि कोई उपयोगकर्ता निजी ब्राउज़िंग मोड में है, तो यह "QuotaExceededError: DOM अपवाद 22: फेंकता है। भंडारण के लिए कुछ जोड़ने का प्रयास किया गया था: कोटा से अधिक।" अपवाद और सफलता / त्रुटि कार्यों को कभी नहीं कहा जाता है।

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

उपयोगकर्ताओं के लिए एक चेतावनी सहित इस मुद्दे को हल किया।

पार्स जावास्क्रिप्ट एसडीके संदर्भ https://parse.com/docs/js/api/classes/Parse.User.html#methods_signUp

एक उपयोगकर्ता नाम (या ईमेल) और पासवर्ड के साथ एक नया उपयोगकर्ता साइन अप करता है। यह सर्वर पर एक नया Parse.User बनाएगा, और स्थानीयस्टेज में सत्र को भी बनाए रखेगा ताकि आप {@link #current} का उपयोग करके उपयोगकर्ता तक पहुंच सकें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.