2011-02-16 14 views
21

क्या कोई अनुरोध करते समय Access-Control-Allow-Origin के कारण हुई त्रुटि को पकड़ने का कोई तरीका है? मैं jQuery का उपयोग कर रहा हूं, और हैंडलर सेट .ajaxError() में कभी भी कॉल नहीं किया जाता है क्योंकि अनुरोध कभी शुरू नहीं होता है।XMLHttpRequest क्रॉस-डोमेन त्रुटियों को पकड़ना

कोई वैकल्पिक हल है?

+0

संभवतः उपयोगी जानकारी: [XMLHttpRequest साथ त्रुटियाँ का पता लगा रहा] (http://ajaxpatterns.org/XMLHttpRequest_Call #Detecting_Errors) – drudge

उत्तर

18

सीओआरएस अनुरोधों के लिए, XmlHttpRequest के ऑनर हैंडलर को आग लगनी चाहिए। कुछ चीजें

function createCORSRequest(method, url){ 
    var xhr = new XMLHttpRequest(); 
    if ("withCredentials" in xhr){ 
    xhr.open(method, url, true); 
    } else if (typeof XDomainRequest != "undefined"){ 
    xhr = new XDomainRequest(); 
    xhr.open(method, url); 
    } else { 
    xhr = null; 
    } 
    return xhr; 
} 

var url = 'YOUR URL HERE'; 
var xhr = createCORSRequest('GET', url); 
xhr.onerror = function() { alert('error'); }; 
xhr.onload = function() { alert('success'); }; 
xhr.send(); 

नोट:: आप कच्चे XMLHttpRequest ऑब्जेक्ट के लिए उपयोग किया है, तो तरह की एक घटना हैंडलर सेट करने का प्रयास

  • CORS अनुरोध पर, ब्राउज़र की console.log एक त्रुटि संदेश प्रदर्शित करेगा । हालांकि, उस त्रुटि संदेश उपलब्ध नहीं है आपको अपना JavaScript कोड को (मैं इस सुरक्षा कारणों के लिए किया जाता है लगता है, मैं पहले एक बार इस प्रश्न पूछा: Is it possible to trap CORS errors?)।

  • xhr.status और xhr.statusText ऑनर हैंडलर में सेट नहीं हैं, इसलिए आपके पास वास्तव में कोई उपयोगी जानकारी नहीं है कि CORS अनुरोध विफल क्यों हुआ। आप केवल इतना जानते हैं कि यह असफल रहा।

+2

आह, लेकिन कैसे आप अन्य अनिर्दिष्ट AJAX त्रुटियों से CORS प्रतिबंध की वजह से त्रुटियों भेद करते हैं? ऐसा लगता है कि 'readyState', 'status', और' statusText' गुणों में XMLHttpRequest ऑब्जेक्ट की विशेषताएँ जो CORS के कारण विफल हुईं। – kpozin

+0

मुझे नहीं लगता कि यह संभव है, इस सवाल को देखें: http://stackoverflow.com/questions/4844643/is-it-possible-to-trap-cors-errors – monsur

+0

XDomainRequest को – mate64

2

के लिए onerror हैंडलर निर्धारित करें और आप क्रॉस-डोमेन अपवाद को पकड़ने के लिए सक्षम हो जाएगा। मुझे नहीं पता कि आतंक घटना अपवादों के लिए निकाल दी गई है और त्रुटि त्रुटि नहीं है, लेकिन मैंने अभी इसका परीक्षण किया और यह काम किया।

req = $.get('http://www.example.com'); 
req.onerror = function() { alert('An exception occurred.') }; 
+0

को बहिष्कृत किया गया है कि जेएस कैसे काम करता है, 'req .onerror = function() {} .. '' req.addEventListener के बराबर है ('त्रुटि', function() {} ..) ' – felixfbecker

5

यह बहुत की तरह त्रुटि स्थिति प्राप्त करने के लिए संभव है:

xhr.onerror = function(e) { 
    alert("Error Status: " + e.target.status); 
}; 

स्रोत: https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest

+4

-1 मैं आपके संदर्भ में ऐसा कुछ नहीं दिख रहा है, और वास्तव में 'onError' में कोई स्टेटस कोड नहीं होना चाहिए। 'ऑनरर' केवल नेटवर्क विफलताओं पर आग लगती है, और यदि आपके पास स्टेटस कोड है जिसका अर्थ है कि एक प्रतिक्रिया सफलतापूर्वक प्राप्त हुई थी। –