डिबगिंग7 मिनट का पठन

JavaScript में "URI Malformed" त्रुटियों को कैसे ठीक करें

JavaScript में आम "URIError: URI malformed" त्रुटि का व्यावहारिक समाधानों के साथ निवारण करें और उसे ठीक करें।

URIError: URI Malformed त्रुटि को समझना

URIError: URI malformed त्रुटि JavaScript में तब उत्पन्न होती है जब आप ऐसी स्ट्रिंग को डिकोड करने का प्रयास करते हैं जिसमें अमान्य percent-encoded अनुक्रम होते हैं। यह त्रुटि decodeURI() या decodeURIComponent() द्वारा तब फेंकी जाती है जब उन्हें कोई विकृत (malformed) एन्कोडेड कैरेक्टर मिलता है।

आम कारण

1. अकेले प्रतिशत चिह्न

एक प्रतिशत चिह्न (%) जिसके ठीक बाद दो हेक्साडेसिमल अंक न हों, अमान्य होता है। उदाहरण के लिए, %, %G, या %2 (अधूरा) — ये सभी इस त्रुटि का कारण बनेंगे।

// ये URIError फेंकेंगे
decodeURIComponent('%');        // अकेला %
decodeURIComponent('%2');       // अधूरा अनुक्रम
decodeURIComponent('%GH');      // अमान्य हेक्स अंक
decodeURIComponent('100%');     // अंत में % बिना हेक्स अंकों के

2. अमान्य UTF-8 अनुक्रम

जब percent-encoded बाइट्स कोई वैध UTF-8 कैरेक्टर अनुक्रम नहीं बनाते, तो डिकोडर उन्हें स्ट्रिंग में परिवर्तित नहीं कर पाता। ऐसा तब हो सकता है जब डेटा दूषित हो गया हो या उसे किसी भिन्न कैरेक्टर एन्कोडिंग का उपयोग करके एन्कोड किया गया हो।

3. डबल एन्कोडिंग

डबल एन्कोडिंग तब होती है जब पहले से एन्कोड की गई स्ट्रिंग को दोबारा एन्कोड कर दिया जाता है। उदाहरण के लिए, %20 (एन्कोडेड स्पेस) को एन्कोड करने पर वह %2520 बन जाता है। जब आप मूल स्ट्रिंग को डिकोड करने का प्रयास करते हैं, तो अनुक्रम अमान्य हो सकते हैं।

इसे कैसे ठीक करें

समाधान 1: try-catch का उपयोग करें

function safeDecode(str) {
  try {
    return decodeURIComponent(str);
  } catch (e) {
    // यदि डिकोडिंग विफल हो जाए तो मूल स्ट्रिंग लौटाएँ
    console.warn('Failed to decode:', str, e.message);
    return str;
  }
}

समाधान 2: डिकोड करने से पहले सत्यापित करें

function isValidEncodedURI(str) {
  try {
    decodeURIComponent(str);
    return true;
  } catch {
    return false;
  }
}

function fixMalformedURI(str) {
  // अकेले % को %25 (एन्कोडेड प्रतिशत) से बदलें
  return str.replace(/%(?![0-9A-Fa-f]{2})/g, '%25');
}

समाधान 3: डबल एन्कोडिंग को रोकें

function smartEncode(str) {
  // पहले डिकोड करने का प्रयास करें - यदि यह सफल होता है, तो
  // स्ट्रिंग पहले से ही एन्कोडेड है
  try {
    const decoded = decodeURIComponent(str);
    // यदि डिकोडिंग ने स्ट्रिंग बदल दी, तो वह एन्कोडेड थी
    if (decoded !== str) {
      return str; // पहले से एन्कोडेड, जैसा है वैसा लौटाएँ
    }
  } catch {
    // वैध एन्कोडेड स्ट्रिंग नहीं है, इसे एन्कोड करें
  }
  return encodeURIComponent(str);
}

रोकथाम के सर्वोत्तम अभ्यास

  • उपयोगकर्ता द्वारा प्रदान किए गए या बाहरी URL को डिकोड करते समय हमेशा try-catch का उपयोग करें
  • URL को प्रोसेस करने से पहले उन्हें सत्यापित करें
  • सावधान रहें कि मानों को डबल-एन्कोड न करें
  • जब संभव हो तो URL और URLSearchParams API का उपयोग करें -- ये एन्कोडिंग को सही ढंग से संभालते हैं
  • एन्कोड करने से पहले क्वेरी स्ट्रिंग मानों को सैनिटाइज़ करें
  • डिबगिंग के लिए विकृत URL को लॉग करें

संबंधित लेख

हमारे मुफ़्त टूल आज़माएँ