JavaScript नीति के रनटाइम की गड़बड़ी से जुड़ी समस्या हल करना

Apigee Edge का दस्तावेज़ देखा जा रहा है.
Apigee X के दस्तावेज़ पर जाएं.
जानकारी

ScriptExecutionFailed

गड़बड़ी का कोड

steps.javascript.ScriptExecutionFailed

गड़बड़ी के जवाब का मुख्य हिस्सा

{
    "fault": {
        "faultstring": "Execution of javascript_policy_name failed with error: error_type: error_description. (javascript_source_file_name)\"",
        "detail": {
            "errorcode": "steps.javascript.ScriptExecutionFailed"
        }
    }
}

गड़बड़ियों के टाइप और उनकी संभावित वजहें

JavaScript नीति की वजह से, कई तरह की स्क्रिप् ट एक्ज़ीक्यूशनविल् ड गड़बड़ियां हो सकती हैं. आम तौर पर देखी जाने वाली कुछ गड़बड़ियां नीचे टेबल में दी गई हैं:

गड़बड़ी का टाइप Cause
रेंज से जुड़ी गड़बड़ी अगर किसी ऐसी संख्या का इस्तेमाल किया जाता है जो कानूनी वैल्यू की सीमा से बाहर है, तो RangeError ट्रिगर होता है.
रेफ़रंस से जुड़ी गड़बड़ी अगर किसी ऐसे वैरिएबल (रेफ़रंस) का इस्तेमाल किया जाता है जिसका एलान नहीं किया गया है, तो ReferenceError दिखती है.
सिंटैक्स में गड़बड़ी अगर सिंटैक्स की गड़बड़ी की मदद से कोड की जांच करने की कोशिश की जाती है, तो SyntaxError होती है.
टाइप करने में गड़बड़ी अगर किसी ऐसे ऑपरेशन का इस्तेमाल किया जाता है जो अनुमानित टाइप की रेंज से बाहर है, तो TypeError ट्रिगर हो जाती है.
यूआरआई से जुड़ी गड़बड़ी अगर यूआरआई फ़ंक्शन में गैर-कानूनी वर्णों का इस्तेमाल किया जाता है, तो URIError गड़बड़ी का मैसेज दिखता है.

रेंज से जुड़ी गड़बड़ी

जब कोई वैल्यू इस्तेमाल की जाती है या कोई वैल्यू पास की जाती है, तो गड़बड़ी का RangeError टाइप दिखता है ऐसे फ़ंक्शन में डालें जो वैल्यू के सेट या रेंज में नहीं है.

उदाहरण के लिए, यह गड़बड़ी इन स्थितियों में आती है:

  1. अगर आपने तारीख के एपीआई के कुछ विकल्पों के साथ 31 सितंबर, 2018 जैसी किसी अमान्य तारीख का इस्तेमाल किया है.
  2. अगर आपने संख्या वाले तरीकों, जैसे कि Number.toPrecision(), Number.tofixed() या Number.toExponential() को अमान्य वैल्यू दी है. उदाहरण के लिए, मान लें कि आपने Number.toPrecision() तरीके में 400 या 500 जैसी बड़ी वैल्यू पास की है, तो आपको रेंज की गड़बड़ी दिखेगी.
  3. अगर आपने गैर-कानूनी लंबाई वाला कोई कलेक्शन बनाया है.

गड़बड़ी के जवाब का मुख्य हिस्सा

{
    "fault": {
        "faultstring": "Execution of javascript_policy_name failed with error: Javascript runtime error: \"RangeError: error_description. (javascript_source_file_name:line_number)\"",
        "detail": {
            "errorcode": "steps.javascript.ScriptExecutionFailed"
        }
    }
}

ध्यान दें: रेंज की गड़बड़ियों का निदान और समाधान, JavaScript नीति की ओर से बताए गए गड़बड़ी के सटीक मैसेज पर निर्भर करता है. आपकी जानकारी के लिए, यहां कुछ उदाहरण दिए गए हैं.

पहला उदाहरण: अमान्य तारीख

गड़बड़ी के रिस्पॉन्स का मुख्य हिस्सा उदाहरण

{
    "fault": {
        "faultstring": "Execution of ParseDate failed with error: Javascript runtime error: \"RangeError: Date is invalid. (ParseDate.js:2)\"",
        "detail": {
            "errorcode": "steps.javascript.ScriptExecutionFailed"
        }
    }
}

संक्रमण की जांच

  1. JavaScript नीति, उसकी सोर्स फ़ाइल, गड़बड़ी वाली लाइन नंबर, और गड़बड़ी की जानकारी की पहचान करें. यह पूरी जानकारी आपको गड़बड़ी के रिस्पॉन्स के faultstring एलिमेंट में मिल सकती है. उदाहरण के लिए, नीचे दिए गए faultstring में, JavaScript नीति का नाम ParseDate है, JavaScript सोर्स फ़ाइल ParseDate.js है, गड़बड़ी वाली लाइन का नंबर 2, और गड़बड़ी की जानकारी Date is invalid है:

    "faultstring": "Execution of ParseDate failed with error: Javascript runtime error: \"RangeError: Date is invalid. (ParseDate.js:2)\""
    
  2. JavaScript सोर्स फ़ाइल (ऊपर चरण #1 में बताई गई) की जांच करें और देखें कि क्या गड़बड़ी वाली लाइन नंबर में किसी अमान्य तारीख का इस्तेमाल किया जा रहा है या लाइन नंबर में इस्तेमाल किए गए वैरिएबल की तारीख अमान्य है. अगर किसी अमान्य तारीख का इस्तेमाल किया गया है, तो यह गड़बड़ी की वजह है.

    यहां एक JavaScript सोर्स फ़ाइल का सैंपल दिया गया है, जिसकी वजह से यह गड़बड़ी होती है:

    ParseDate.js

    var date = new Date('2018-09-31T11:19:08.402Z');
    date.toISOString();
    

    इस उदाहरण में, लाइन नंबर 2 में वैरिएबल date का इस्तेमाल किया गया है. सोर्स फ़ाइल की जांच करते समय, यह देखा जा सकता है कि date वैरिएबल अमान्य तारीख के साथ सेट किया गया है: 2018-09-31T11:19:08.402Z. यह तारीख अमान्य है, क्योंकि सितंबर में 31 दिन नहीं होते हैं.

    ध्यान दें: इस उदाहरण में इस्तेमाल किया गया ISO-8601 फ़ॉर्मैट है: YYYY-MM-DDTHH:mm:ss.sssZ

रिज़ॉल्यूशन

पक्का करें कि JavaScript कोड में तारीख के एपीआई का इस्तेमाल करते समय, आप हमेशा मान्य तारीख का इस्तेमाल करें.

उदाहरण के तौर पर ऊपर दिखाए गए JavaScript कोड को ठीक करने के लिए, आप तारीख को Sept 30 2018 के तौर पर सेट कर सकते हैं, जैसा कि नीचे दिखाया गया है:

var date = new Date('2018-09-30T11:19:08.402Z');
date.toISOString();

दूसरा उदाहरण: Precision API को अमान्य नंबर भेजा गया

गड़बड़ी के रिस्पॉन्स का मुख्य हिस्सा उदाहरण

{
    "fault": {
        "faultstring": "Execution of SetNumberPrecision failed with error: Javascript runtime error: "RangeError: Precision 400 out of range. (SetNumberPrecision.js:2)\"",
        "detail": {
            "errorcode": "steps.javascript.ScriptExecutionFailed"
        }
    }
}

संक्रमण की जांच

  1. JavaScript नीति, उसकी सोर्स फ़ाइल, उस लाइन नंबर की पहचान करें जहां गड़बड़ी हुई है, और गड़बड़ी के बारे में जानकारी दें. आपको यह सारी जानकारी, गड़बड़ी के जवाब के faultstring एलिमेंट में मिल सकती है. उदाहरण के लिए, यहां दिए गए faultstring में, JavaScript नीति का नाम SetNumberPrecision है, JavaScript सोर्स फ़ाइल का नाम SetNumberPrecision.js है, गड़बड़ी वाली लाइन का नंबर 2, और गड़बड़ी की जानकारी Precision 400 out of range. है

    "faultstring": "Execution of SetNumberPrecision failed with error: Javascript runtime error: "RangeError: Precision 400 out of range. (SetNumberPrecision.js:2)\""
    
  2. JavaScript सोर्स फ़ाइल की जांच करें (ऊपर चरण #1 में पहचान की गई है). अगर गड़बड़ी के ब्यौरे में बताई गई बड़ी संख्या का इस्तेमाल किसी खास लाइन नंबर में किया गया है, तो गड़बड़ी की वजह यही है.

    यहां एक JavaScript सोर्स फ़ाइल का सैंपल दिया गया है, जिसकी वजह से यह गड़बड़ी होती है:

    SetNumberPrecision.js

    var number = 12.3456;
    var rounded_number = number.toPrecision(400);
    print("rounded_number = " + rounded_number);
    

    इस उदाहरण में, ध्यान दें कि लाइन नंबर 2 में 400 की बड़ी वैल्यू का इस्तेमाल किया गया है. अंकों की इतनी बड़ी संख्या को सटीक नहीं बनाया जा सकता, इसलिए आपको नीचे दी गई गड़बड़ी मिलती है:

    "faultstring": "Execution of SetNumberPrecision failed with error: Javascript runtime error: "RangeError: Precision 400 out of range. (SetNumberPrecision.js:2)\""
    

रिज़ॉल्यूशन

पक्का करें कि toPrecision() तरीके में इस्तेमाल की गई संख्या, मान्य वैल्यू के सेट में हो.

ऊपर दिए गए JavaScript उदाहरण में मौजूद समस्या को ठीक करने के लिए, सटीक अंकों की संख्या को 2 पर सेट करें, जो मान्य है:

var number = 12.3456;
var rounded_number = number.toPrecision(2);
print("rounded_number = " + rounded_number);

पहचान फ़ाइल में गड़बड़ी

आपके JavaScript में किसी तय न किए गए वैरिएबल की वजह से गड़बड़ी का ReferenceError टाइप दिखता है का इस्तेमाल किया जाता हो (रेफ़रंस किया गया हो) या चलाया जाता हो.

गड़बड़ी के जवाब का मुख्य हिस्सा

{
    "fault": {
        "faultstring": "Execution of javascript_policy_name failed with error: Javascript runtime error: \"ReferenceError: variable_name is not defined. (javascript_source_file_name:line_number)\"",
        "detail": {
            "errorcode": "steps.javascript.ScriptExecutionFailed"
        }
    }
}

गड़बड़ी के रिस्पॉन्स का मुख्य हिस्सा उदाहरण

{
    "fault": {
        "faultstring": "Execution of ComputeTotalPrice failed with error: Javascript runtime error: \"ReferenceError: \"price\" is not defined. (ComputeTotalPrice.js:3)\"",
        "detail": {
            "errorcode": "steps.javascript.ScriptExecutionFailed"
        }
    }
}

संक्रमण की जांच

  1. JavaScript नीति, उसकी सोर्स फ़ाइल, और उस लाइन नंबर की पहचान करें जहां तय नहीं किया गया वैरिएबल का रेफ़रंस दिया गया है. आपको यह सारी जानकारी, गड़बड़ी के जवाब के faultstring एलिमेंट में मिल सकती है. उदाहरण के लिए, नीचे दिए गए faultstring में, JavaScript नीति का नाम ComputeTotalPrice है और उससे जुड़ी सोर्स फ़ाइल ComputeTotalPrice.js है. गड़बड़ी वाली लाइन का नंबर 3 और वैरिएबल का नाम तय नहीं है price.

    "faultstring": "Execution of ComputeTotalPrice failed with error: Javascript runtime error: \"ReferenceError: \"price\" is not defined. (ComputeTotalPrice.js:3)\""
    
  2. JavaScript सोर्स फ़ाइल में लाइन नंबर की जांच करें और पुष्टि करें कि ऊपर दिए गए पहले चरण में पहचाने गए, बिना वैल्यू वाले वैरिएबल का रेफ़रंस दिया जा रहा है या नहीं. उदाहरण के लिए, नीचे दिया गया JavaScript कोड, लाइन 3 में तय नहीं किए गए वैरिएबल price का रेफ़रंस देता है, जो गड़बड़ी वाली स्ट्रिंग से मेल खाता है:

    ComputeTotalPrice.js

    var item = context.getVariable("request.queryparam.item");
    var quantity = context.getVariable("request.queryparam.quantity");
    var totalprice = parseInt(quantity) * parseInt(price);
    context.setVariable("TotalPrice", totalprice);
    
    
  3. देखें कि JavaScript कोड में कोई वैरिएबल तय किया गया है या नहीं. अगर वैरिएबल तय नहीं किया गया है, तो यह गड़बड़ी की वजह है.

    उदाहरण के लिए ऊपर दी गई स्क्रिप्ट में, ऐसा price वैरिएबल इस्तेमाल किया गया है जिसका एलान नहीं किया गया है या जिसे तय नहीं किया गया है; इसलिए, आपको नीचे दी गई गड़बड़ी दिखेगी:

    "faultstring": "Execution of ComputeTotalPrice failed with error: Javascript runtime error: \"ReferenceError: \"price\" is not defined. (ComputeTotalPrice.js:3)\""
    

रिज़ॉल्यूशन

पक्का करें कि JavaScript कोड में रेफ़र किए गए सभी वैरिएबल सही तरीके से तय किए गए हैं.

ऊपर दिखाए गए JavaScript के उदाहरण से जुड़ी समस्या को ठीक करने के लिए, वैरिएबल की कीमत तय करने के बाद उसका इस्तेमाल करें. उदाहरण के लिए:

var item = context.getVariable("request.queryparam.item");
var quantity = context.getVariable("request.queryparam.quantity");
var price = context.getVariable("request.queryparam.price");
var totalprice = parseInt(quantity) * parseInt(price);
context.setVariable("TotalPrice", totalprice);

सिंटैक्स गड़बड़ी

जब JavaScript इंजन को टोकन मिलते हैं, तो गड़बड़ी का SyntaxError टाइप दिखता है या टोकन ऑर्डर, जो भाषा के सिंटैक्स के अनुरूप न हो या फ़ॉर्मैट इनपुट को JSON/XML पार्स जैसे पार्सर एपीआई को पास किया जाता है.

उदाहरण के लिए, अगर JavaScript नीति में इस्तेमाल किए गए JSON.parse API को इनपुट के तौर पर अमान्य या गलत JSON पेलोड पास किया जाता है, तो आपको यह गड़बड़ी मिलती है.

गड़बड़ी का जवाब

{
    "fault": {
        "faultstring": "Execution of javascript_policy_name failed with error: Javascript runtime error: \"SyntaxError: error_description. (javascript_source_file_name:line_number)\"",
        "detail": {
            "errorcode": "steps.javascript.ScriptExecutionFailed"
        }
    }
}

गड़बड़ी के रिस्पॉन्स का मुख्य हिस्सा उदाहरण

{
    "fault": {
        "faultstring": "Execution of ParseJSONRequest failed with error: Javascript runtime error: \"SyntaxError: Unexpected token: <. (ParseJSONRequest.js:2)\"",
        "detail": {
            "errorcode": "steps.javascript.ScriptExecutionFailed"
        }
    }
}

संक्रमण की जांच

  1. JavaScript नीति, उसकी सोर्स फ़ाइल, गड़बड़ी वाली लाइन नंबर, और गड़बड़ी की जानकारी की पहचान करें. आपको यह सारी जानकारी, गड़बड़ी के जवाब के faultstring एलिमेंट में मिल सकती है. उदाहरण के लिए, नीचे दिए गए faultstring में, JavaScript नीति का नाम ParseJSONRequest है, JavaScript सोर्स फ़ाइल ParseJSONRequest.js है, गड़बड़ी वाली लाइन का नंबर 2, और गड़बड़ी की जानकारी Unexpected token है:

    "faultstring": "Execution of ParseJSONRequest failed with error: Javascript runtime error: \"SyntaxError: Unexpected token: <. (ParseJSONRequest.js:2)\""
    
  2. JavaScript सोर्स फ़ाइल (ऊपर दिए गए पहले चरण में पहचानी गई) में लाइन नंबर 2 की जांच करें और देखें कि कौनसा ऑपरेशन किया जा रहा है. अगर JSON.parse() फ़ंक्शन चलाया जा रहा है, तो उसे पास किए गए इनपुट पैरामीटर की जांच करें. अगर इनपुट पैरामीटर मान्य नहीं है या गलत JSON है, तो यह गड़बड़ी की वजह है.

    यहां एक JavaScript कोड का सैंपल दिया गया है, जो यह गड़बड़ी दिखाता है:

    var input = context.getVariable("request.content");
    var result = JSON.parse(input);
    

    इस उदाहरण में, एपीआई प्रॉक्सी को पास किए गए अनुरोध पेलोड (request.content) का इस्तेमाल JSON.parse() फ़ंक्शन को इनपुट के तौर पर किया जाता है.

    यहां एपीआई कॉल का सैंपल दिया गया है, जिससे पता चलता है कि अनुरोध कैसे पास किया गया था:

    curl -v "http://<org>-<env>.apigee.net/v1/js-demo" -H "Content-Type: application/json" -X POST -d '<city>Bangalore</city>'
    

    ऊपर दिए गए अनुरोध में, नीचे दिया गया एक्सएमएल पेलोड एपीआई प्रॉक्सी को पास किया जाता है <city>Bangalore</city>. JSON.parse एपीआई के लिए, मान्य JSON पास होना ज़रूरी है एक्सएमएल पेलोड को पास कर लिया जाता है, इसलिए यह नीचे दी गई गड़बड़ी की वजह से काम नहीं करता:

    "Execution of ParseJSONRequest failed with error: Javascript runtime error: \"SyntaxError: Unexpected token: <. (ParseJSONRequest.js:2)\""
    

रिज़ॉल्यूशन

JavaScript कोड में इस्तेमाल किए गए पार्स एपीआई को मान्य इनपुट देना न भूलें.

ऊपर बताई गई नीति के सैंपल से जुड़ी समस्या को ठीक करने के लिए, JSON पेलोड का मान्य अनुरोध इस तरीके से पास करें:

curl -v "http://<org>-<env>.apigee.net/v1/js-demo" -H "Content-Type: application/json" -X POST -d '{"city" : "Bangalore"}'

लिखने में गड़बड़ी

गड़बड़ी का टाइप TypeError तब दिखता है, जब:

  • किसी फ़ंक्शन में पास किया गया ऑपरेंड या तर्क उस ऑपरेटर या फ़ंक्शन के ज़रिए अपेक्षित प्रकार के साथ असंगत है.
  • शून्य, तय नहीं या गलत ऑब्जेक्ट पर फ़ंक्शन शुरू किया गया है.
  • किसी प्रॉपर्टी को शून्य, बिना तय किए गए या गलत ऑब्जेक्ट से ऐक्सेस किया गया है.

उदाहरण के लिए, हमें किसी टाइप की गड़बड़ी दिखती है:

  • किसी नंबर पर toUpperCase() फ़ंक्शन शुरू करने की कोशिश करने पर. यह है क्योंकि toUpperCase() फ़ंक्शन सिर्फ़ स्ट्रिंग ऑब्जेक्ट पर शुरू किया जा सकता है.
  • अगर किसी शून्य या बिना परिभाषा वाले ऑब्जेक्ट से प्रॉपर्टी पढ़ने की कोशिश की जाती है.

गड़बड़ी के जवाब का मुख्य हिस्सा

{
    "fault": {
        "faultstring": "Execution of javascript_policy_name failed with error: Javascript runtime error: \"TypeError: error_description. (javascript_source_file_name:line_number)\"",
        "detail": {
            "errorcode": "steps.javascript.ScriptExecutionFailed"
        }
    }
}

पहला उदाहरण: किसी गलत ऑब्जेक्ट पर फ़ंक्शन शुरू करना

अगर किसी ऐसे ऑब्जेक्ट पर फ़ंक्शन को ट्रिगर करने की कोशिश की जाती है जो काम नहीं करता, तो आपको यह गड़बड़ी दिखती है. उदाहरण के लिए, अगर आपको मिलने वाले नंबर पर toUpperCase() फ़ंक्शन शुरू करने की कोशिश की जाती है गड़बड़ी को ठीक करें. इसकी वजह यह है कि toUpperCase() फ़ंक्शन सिर्फ़ यहां शुरू हो सकता है स्ट्रिंग ऑब्जेक्ट.

गड़बड़ी के रिस्पॉन्स बॉडी का उदाहरण

{
    "fault": {
        "faultstring": "Execution of ConvertToUpperCase failed with error: Javascript runtime error: \"TypeError: Cannot find function toUpperCase in object 100. (ConvertToUpperCase.js:2)\"",
        "detail": {
            "errorcode": "steps.javascript.ScriptExecutionFailed"
        }
    }
}

संक्रमण की जांच

  1. JavaScript नीति, उसकी सोर्स फ़ाइल, उस लाइन नंबर की पहचान करें जहां गड़बड़ी हुई है, और गड़बड़ी के बारे में जानकारी दें. यह पूरी जानकारी आपको गड़बड़ी के रिस्पॉन्स के faultstring एलिमेंट में मिल सकती है. उदाहरण के लिए, यहां दिए गए faultstring में, JavaScript नीति का नाम ConvertToUpperCase है, सोर्स फ़ाइल का नाम ConvertToUpperCase.js, लाइन नंबर 2, और गड़बड़ी की जानकारी **Cannot find function toUpperCase in object 100. है

    "faultstring": "Execution of ConvertToUpperCase failed with error: Javascript runtime error: \"TypeError: Cannot find function toUpperCase in object 100. (ConvertToUpperCase.js:2)\""
    

    गड़बड़ी की जानकारी से पता चलता है कि आपने toUpperCase() फ़ंक्शन को ऐसे ऑब्जेक्ट पर लागू किया है जिसकी संख्यात्मक वैल्यू 100 है.

  2. JavaScript सोर्स फ़ाइल की जांच करें और पुष्टि करें कि क्या लाइन नंबर 2 (ऊपर दिए गए चरण # 1 में पहचाना गया) पर, किसी ऐसे ऑब्जेक्ट पर फ़ंक्शन toUpperCase() को लागू किया जा रहा है जिसकी संख्यात्मक वैल्यू 100 है. अगर हां, तो यह गड़बड़ी की वजह है.

    यहां एक JavaScript सोर्स फ़ाइल का उदाहरण दिया गया है, जो यह गड़बड़ी पैदा करती है:

    ConvertToUpperCase.js

    var number = 100;
    var result = number.toUpperCase();
    

    ऊपर दिखाए गए JavaScript कोड में, वैरिएबल number को 100 की वैल्यू के साथ सेट किया गया है. इसके बाद, नंबर ऑब्जेक्ट पर toUpperCase()( फ़ंक्शन शुरू हो जाता है. toUpperCase() फ़ंक्शन सिर्फ़ स्ट्रिंग ऑब्जेक्ट पर लागू किया जा सकता है. इसलिए, आपको गड़बड़ी का यह मैसेज दिखता है:

    "Execution of ConvertToUpperCase failed with error: Javascript runtime error: \"TypeError: Cannot find function toUpperCase in object 100. (ConvertToUpperCase.js:2)\""
    

रिज़ॉल्यूशन

मान्य ऑब्जेक्ट पर हमेशा toUpperCase() जैसे फ़ंक्शन का इस्तेमाल करें.

ऊपर दिए गए उदाहरण को ठीक करने के लिए, आप एक स्ट्रिंग वैरिएबल बनाकर किसी स्ट्रिंग पर toUpperCase() फ़ंक्शन:

var text = "Hello Apigee !";
var result = text.toUpperCase();

उदाहरण 2: किसी तय नहीं किए गए ऑब्जेक्ट से प्रॉपर्टी नहीं पढ़ी जा सकती

अगर किसी तय न किए गए ऑब्जेक्ट से किसी प्रॉपर्टी को ऐक्सेस करने/पढ़ने की कोशिश की जाती है, तो इस गड़बड़ी को ठीक करना ज़रूरी है. उदाहरण के लिए, यह गड़बड़ी तब हो सकती है, जब किसी ऐरे में मौजूद ऑब्जेक्ट से डेटा ऐक्सेस करने की कोशिश की जाती है, लेकिन ऑब्जेक्ट की वैल्यू तय न की गई हो. पूरी जानकारी देखें देखें.

गड़बड़ी के रिस्पॉन्स का मुख्य हिस्सा उदाहरण

{
    "fault": {
        "faultstring": "Execution of ParseJSONResponse failed with error: Javascript runtime error: \"TypeError: Cannot read property \"length\" from undefined. (ParseJSONResponse.js:7)\"",
        "detail": {
            "errorcode": "steps.javascript.ScriptExecutionFailed"
        }
    }
}

संक्रमण की जांच

  1. JavaScript नीति, उसकी सोर्स फ़ाइल, उस लाइन नंबर की पहचान करें जहां गड़बड़ी हुई और गड़बड़ी के बारे में जानकारी दें. आपको यह सारी जानकारी, गड़बड़ी के जवाब के faultstring एलिमेंट में मिल सकती है. उदाहरण के लिए, यहां दिए गए faultstring में, नीति का नाम ParseJSONResponse है, सोर्स फ़ाइल का नाम ParseJSONResponse.js, लाइन नंबर 6, और गड़बड़ी की जानकारी Cannot read property "length" from undefined है.

    "faultstring": "Execution of ParseJSONResponse failed with error: Javascript runtime error: \"TypeError: Cannot read property \"length\" from undefined. (ParseJSONResponse.js:6)\""
    

    गड़बड़ी से पता चलता है कि प्रॉपर्टी length को किसी तय ऑब्जेक्ट से नहीं पढ़ा जा सकता.

  2. JavaScript सोर्स फ़ाइल में लाइन नंबर की जांच करें (ऊपर चरण #1 में बताया गया है) और पुष्टि करें कि ऑब्जेक्ट का कोई मान्य मान है या उसके बारे में कोई जानकारी नहीं है. आपको पूरी सोर्स फ़ाइल को पढ़कर यह समझना पड़ सकता है कि किसी खास ऑब्जेक्ट को कैसे तय किया गया या कैसे बनाया गया. साथ ही, यह भी पता करना पड़ सकता है कि ऑब्जेक्ट को 'तय नहीं किया गया' क्यों माना गया. अगर आपको लगता है कि उस खास ऑब्जेक्ट के बारे में कोई जानकारी नहीं है और आप उससे प्रॉपर्टी की लंबाई ऐक्सेस करने की कोशिश कर रहे हैं, तो यह गड़बड़ी की वजह है.

    आइए, इस समस्या को बेहतर तरीके से समझने के लिए एक उदाहरण देखें:

    1. मान लें कि आपको बैकएंड सर्वर से, यह JSON रिस्पॉन्स मिलता है:

      {
          "cars": [
             { "name":"Toyota", "count": 150 }
             { "name":"Honda", "count": 100 },
             { "name":"Ford", "count": 75 }
          ]
      }
      
    2. यहां एक JavaScript सोर्स फ़ाइल का उदाहरण दिया गया है, जो JSON के इस रिस्पॉन्स को पार्स करती है और ऊपर बताई गई गड़बड़ी पर ले जाता है:

      ParseJSONResponse.js

      // Get the JSON response
      var jsonData = context.getVariable("response.content");
      print (jsonData);
      
      // Read the cars array
      for (var i = 0; i < jsonData.cars.length; i++)
        {
        print("name = " + jsonData.cars[i].name);
        print("count = " + jsonData.cars[i].count);
        }
      
    3. JavaScript कोड की ध्यान से जांच करने पर, लाइन नंबर 2 में देखा जा सकता है कि response.content को jsonData वैरिएबल में, सामान्य स्ट्रिंग (कोट में) के तौर पर पढ़ा/स्टोर किया जाता है.

    4. jsonData एक सामान्य स्ट्रिंग है. इसलिए, जब jsonData (jsonData.cars) से cars को ऐक्सेस करने की कोशिश की जाती है, तो उसके बारे में नहीं बताया जाएगा.

    5. इसके बाद, जब jsonData.cars से प्रॉपर्टी length को पढ़ने की कोशिश की जाती है, जो कि तय नहीं है, तो आपको गड़बड़ी का यह मैसेज मिलता है:

      "faultstring": "Execution of ParseJSONResponse failed with error: Javascript runtime error: \"TypeError: Cannot read property \"length\" from undefined. (ParseJSONResponse.js:6)\""
      

रिज़ॉल्यूशन

पक्का करें कि आप काम के JSON API का इस्तेमाल करके, JSON डेटा को हमेशा JSON ऑब्जेक्ट के तौर पर पढ़ें.

ऊपर बताए गए JavaScript के उदाहरण को ठीक करने के लिए, आप JSON.parse() फ़ंक्शन का इस्तेमाल कर सकते हैं JSON ऑब्जेक्ट के रूप में पाने के लिए, response.content ऑब्जेक्ट पर. इसके बाद, ये काम किए जा सकते हैं cars कलेक्शन को ऐक्सेस करें और अरे को दोहराएं.

// Get the JSON response
var data = context.getVariable("response.content");
var jsonData = JSON.parse(data);
print (jsonData);

// Read the cars array
for (var i = 0; i < jsonData.cars.length; i++)
{
    print("name = " + jsonData.cars[i].name);
    print("count = " + jsonData.cars[i].count);
}

यूआरआई गड़बड़ी

यूआरआई फ़ंक्शन में गैर-कानूनी वर्णों का इस्तेमाल करने पर, गड़बड़ी का URIError टाइप दिखता है. उदाहरण के लिए, अगर आप ऐसा यूआरआई पास करते हैं जिसमें decodeURI या decodeURIComponent फ़ंक्शन का इस्तेमाल करता है, तो आपको यह गड़बड़ी दिखेगी.

गड़बड़ी का जवाब

{
    "fault": {
        "faultstring": "Execution of javascript_policy_name failed with error: Javascript runtime error: \"URIError: error_description. (javascript_source_file_name:line_number)\"",
        "detail": {
            "errorcode": "steps.javascript.ScriptExecutionFailed"
        }
    }
}

गड़बड़ी के रिस्पॉन्स का मुख्य हिस्सा उदाहरण

{
    "fault": {
        "faultstring": "Execution of URIDecode failed with error: Javascript runtime error: \"URIError: Malformed URI sequence. (URIDecode.js:2)\"",
        "detail": {
            "errorcode": "steps.javascript.ScriptExecutionFailed"
        }
    }
}

संक्रमण की जांच

  1. JavaScript नीति, उसकी सोर्स फ़ाइल, और उस लाइन नंबर की पहचान करें जहां गड़बड़ी हुई और गड़बड़ी का ब्यौरा. आपको यह सारी जानकारी यहां मिलेगी गड़बड़ी के रिस्पॉन्स का gtagस्ट्रिंग एलिमेंट. उदाहरण के लिए, यहां दी गई फ़ॉल्ट स्ट्रिंग में, JavaScript नीति का नाम URIDecode</code, JavaScript सोर्स फ़ाइल URIDecode.js, लाइन नंबर 2, और गड़बड़ी का ब्यौरा Malformed URI sequence है:

    "faultstring": "Execution of URIDecode failed with error: Javascript runtime error: \"URIError: Malformed URI sequence. (URIDecode.js:2)\""
    

    गड़बड़ी के ब्यौरे से पता चलता है कि URIDecode.js की लाइन नंबर 2 में, गलत यूआरआई क्रम का इस्तेमाल किया गया है.

  2. JavaScript सोर्स फ़ाइल की जांच करें और पुष्टि करें कि किसी भी यूआरआई फ़ंक्शन को दिए गए तर्क में कोई गैर-कानूनी वर्ण तो नहीं है. अगर हां, तो यह गड़बड़ी की वजह है.

    यहां एक JavaScript सोर्स फ़ाइल का उदाहरण दिया गया है, जो यह गड़बड़ी पैदा करती है:

    URIDecode.js

    var str = "75%-Completed";
    var decoded_str = decodeURIComponent(str);
    context.setVariable("decoded_str", decoded_str);
    

    ऊपर दिए गए JavaScript कोड के उदाहरण में, decodeURIComponent() में पास किए गए वैरिएबल str में प्रतिशत का चिह्न है, जिसे गैर-कानूनी वर्ण माना जाता है. इसलिए, आपको गड़बड़ी का यह मैसेज मिलता है:

    "Execution of URIDecode failed with error: Javascript runtime error: \"URIError: Malformed URI sequence. (URIDecode.js:2)\""
    

रिज़ॉल्यूशन

पक्का करें कि यूआरआई फ़ंक्शन में इस्तेमाल किए गए सभी वर्ण कानूनी हैं और उन्हें इस्तेमाल करने की अनुमति है.

ऊपर दिए गए JavaScript के उदाहरण से समस्या हल करने के लिए, प्रतिशत के निशान को कोड में बदलें. उदाहरण के लिए, %25:

var str = "75%25-Completed";
var decoded_str = decodeURIComponent(str);
context.setVariable("decoded_str", decoded_str);