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 की नीति के चालू होने पर, कई तरह की Script दूसरी तरह की गड़बड़ियां हो सकती हैं. आम तौर पर दिखने वाली कुछ गड़बड़ियों की जानकारी नीचे टेबल में दी गई है:

गड़बड़ी का टाइप 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 नीति के गड़बड़ी के मैसेज के आधार पर तय होता है. आपकी जानकारी के लिए यहां कुछ उदाहरण दिए गए हैं.

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

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

{
    "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 कोड में Date API का इस्तेमाल करते समय पक्का करें कि आप हमेशा मान्य तारीख का इस्तेमाल करें.

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

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

उदाहरण 2: Precision एपीआई को भेजा गया अमान्य नंबर

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

{
    "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);

संदर्भ गड़बड़ी

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

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

{
    "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 सोर्स फ़ाइल में लाइन नंबर की जांच करें और पुष्टि करें कि ऊपर चरण #1 में बताए गए तय वैरिएबल का रेफ़रंस दिया जा रहा है या नहीं. उदाहरण के लिए, नीचे दिया गया 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);

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

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

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

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

{
    "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 सोर्स फ़ाइल (ऊपर चरण #1 में पहचानी गई) में लाइन नंबर 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 API को लगता है कि मान्य 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 सोर्स फ़ाइल की जांच करें और पुष्टि करें कि क्या किसी ऐसे ऑब्जेक्ट पर फ़ंक्शन toUpperCase() शुरू किया जा रहा है जिसकी लाइन नंबर 2 पर न्यूमेरिक वैल्यू 100 है (जिसकी पहचान ऊपर दिए गए चरण # 1 में की गई है). अगर हां, तो यही गड़बड़ी की वजह है.

    यहां 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();

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

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

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

{
    "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 के उदाहरण को ठीक करने के लिए, आपके पास response.content ऑब्जेक्ट पर JSON.parse() फ़ंक्शन का इस्तेमाल करके उसे JSON ऑब्जेक्ट के तौर पर पाने का विकल्प है. इसके बाद, 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 की नीति, उसकी सोर्स फ़ाइल, वह लाइन नंबर जहां गड़बड़ी हुई, और गड़बड़ी की जानकारी की पहचान करें. आपको यह पूरी जानकारी गड़बड़ी के रिस्पॉन्स में गड़बड़ी वाले एलिमेंट में मिल सकती है. उदाहरण के लिए, यहां दी गई गड़बड़ी में, 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);