Apigee Edge का दस्तावेज़ देखा जा रहा है.
Apigee X के दस्तावेज़ पर जाएं. info
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 की नीति, ScriptExecutionFailed से जुड़ी कई तरह की गड़बड़ियां दिखा सकती है. यहां दी गई टेबल में, आम तौर पर दिखने वाली कुछ गड़बड़ियों के बारे में बताया गया है:
| गड़बड़ी का टाइप | Cause |
| रेंज से जुड़ी गड़बड़ी | अगर आपने ऐसी संख्या का इस्तेमाल किया है जो मान्य वैल्यू की सीमा से बाहर है, तो RangeError दिखेगा. |
| रेफ़रंस से जुड़ी गड़बड़ी | अगर आपने किसी ऐसे वैरिएबल का इस्तेमाल किया है जिसे तय नहीं किया गया है, तो ReferenceError दिखेगा. |
| सिंटैक्स से जुड़ी गड़बड़ी | अगर सिंटैक्स में गड़बड़ी वाले कोड का आकलन करने की कोशिश की जाती है, तो SyntaxError दिखता है. |
| टाइप से जुड़ी गड़बड़ी | अगर आपने कोई ऐसा ऑपरेशन इस्तेमाल किया है जो अनुमानित टाइप की रेंज से बाहर है, तो TypeError दिखेगा. |
| यूआरआई से जुड़ी गड़बड़ी | अगर यूआरआई फ़ंक्शन में अमान्य वर्णों का इस्तेमाल किया जाता है, तो URIError दिखता है. |
रेंज से जुड़ी गड़बड़ी
RangeError गड़बड़ी तब होती है, जब किसी वैल्यू पर कार्रवाई की जाती है या किसी फ़ंक्शन को ऐसी वैल्यू पास की जाती है जो वैल्यू के सेट या रेंज में नहीं होती.
उदाहरण के लिए, यह गड़बड़ी इन स्थितियों में दिखती है:
- अगर आपने तारीख के कुछ एपीआई के साथ, 31 सितंबर, 2018 जैसी अमान्य तारीख का इस्तेमाल किया है.
- अगर आपने
Number.toPrecision(),Number.tofixed()याNumber.toExponential()जैसे न्यूमेरिक तरीकों के लिए अमान्य वैल्यू पास की है. उदाहरण के लिए, मान लें कि आपनेNumber.toPrecision()तरीके में 400 या 500 जैसी बड़ी वैल्यू पास की है, तो आपको रेंज से जुड़ी गड़बड़ी दिखेगी. - अगर आपने गलत लंबाई वाली कोई ऐरे बनाई है.
गड़बड़ी के जवाब का मुख्य हिस्सा
{
"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"
}
}
}
संक्रमण की जांच
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)\""JavaScript की सोर्स फ़ाइल (ऊपर दिए गए पहले चरण में इसकी पहचान की गई है) की जांच करें. देखें कि क्या गड़बड़ी में बताई गई लाइन संख्या में अमान्य तारीख का इस्तेमाल किया गया है या लाइन संख्या में इस्तेमाल किए गए वैरिएबल में अमान्य तारीख है. अगर अमान्य तारीख का इस्तेमाल किया जाता है, तो गड़बड़ी की वजह यही होती है.
यहां 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 APIs का इस्तेमाल करते समय, हमेशा मान्य तारीख का इस्तेमाल किया जाए.
ऊपर दिखाए गए JavaScript कोड के उदाहरण को ठीक करने के लिए, तारीख को Sept 30 2018 के तौर पर सेट किया जा सकता है. इसके लिए, यहां दिया गया तरीका अपनाएं:
var date = new Date('2018-09-30T11:19:08.402Z');
date.toISOString();
दूसरा उदाहरण: सटीक जानकारी देने वाले एपीआई को अमान्य नंबर भेजा गया
गड़बड़ी के जवाब के मुख्य हिस्से का उदाहरण
{
"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"
}
}
}
संक्रमण की जांच
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)\""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"
}
}
}
संक्रमण की जांच
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)\""JavaScript की सोर्स फ़ाइल में लाइन नंबर की जांच करें. साथ ही, पुष्टि करें कि ऊपर दिए गए पहले चरण में पहचाने गए अनडिफ़ाइंड वैरिएबल का रेफ़रंस दिया गया है या नहीं. उदाहरण के लिए, यहां दिए गए JavaScript कोड में, तीसरी लाइन में
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);देखें कि 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/XML पार्स जैसे पार्सर एपीआई को अमान्य फ़ॉर्मैट वाला इनपुट दिया जाता है.
उदाहरण के लिए, अगर अमान्य या गलत तरीके से बनाए गए JSON पेलोड को JavaScript नीति में इस्तेमाल किए गए JSON.parse एपीआई के इनपुट के तौर पर पास किया जाता है, तो आपको यह गड़बड़ी दिखेगी.
गड़बड़ी के जवाब का मुख्य हिस्सा
{
"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"
}
}
}
संक्रमण की जांच
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)\""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.parseAPI को मान्य JSON फ़ॉर्मैट में डेटा पास करने की ज़रूरत होती है. हालांकि, इसके बजाय XML पेलोड पास किया गया है. इसलिए, यह गड़बड़ी हुई है:"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"
}
}
}
उदाहरण 1: किसी फ़ंक्शन को गलत ऑब्जेक्ट पर लागू करना
अगर किसी ऐसे ऑब्जेक्ट पर फ़ंक्शन को लागू करने की कोशिश की जाती है जिस पर यह काम नहीं करता, तो आपको यह गड़बड़ी दिखेगी.
उदाहरण के लिए, अगर किसी नंबर पर 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"
}
}
}
संक्रमण की जांच
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 है.JavaScript की सोर्स फ़ाइल की जांच करें. साथ ही, यह पुष्टि करें कि आपने उस ऑब्जेक्ट पर
toUpperCase()फ़ंक्शन को कॉल किया है जिसकी संख्यात्मक वैल्यू लाइन नंबर 2 पर 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();
दूसरा उदाहरण: तय नहीं किए गए ऑब्जेक्ट से प्रॉपर्टी नहीं पढ़ी जा सकती
अगर किसी ऐसे ऑब्जेक्ट से प्रॉपर्टी को ऐक्सेस/रीड करने की कोशिश की जाती है जिसे तय नहीं किया गया है, तो आपको यह गड़बड़ी दिखेगी. उदाहरण के लिए, यह गड़बड़ी तब हो सकती है, जब किसी ऐरे में मौजूद ऑब्जेक्ट से डेटा ऐक्सेस करने की कोशिश की जाती है, लेकिन ऑब्जेक्ट को तय नहीं किया गया है. इस बारे में ज़्यादा जानकारी यहां दी गई है.
गड़बड़ी के जवाब के मुख्य हिस्से का उदाहरण
{
"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"
}
}
}
संक्रमण की जांच
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 प्रॉपर्टी को नहीं पढ़ा जा सकता.
JavaScript सोर्स फ़ाइल में लाइन नंबर देखें. यह फ़ाइल, ऊपर दिए गए पहले चरण में बताई गई है. साथ ही, पुष्टि करें कि ऑब्जेक्ट की वैल्यू मान्य है या वह तय नहीं की गई है. आपको पूरी सोर्स फ़ाइल को पढ़ना और समझना पड़ सकता है. इससे यह पता लगाया जा सकता है कि किसी ऑब्जेक्ट को कैसे तय किया गया है या उसे कैसे बनाया गया है. साथ ही, यह भी पता लगाया जा सकता है कि ऑब्जेक्ट को 'तय नहीं किया गया' के तौर पर क्यों मार्क किया गया है. अगर आपको लगता है कि ऑब्जेक्ट वाकई में तय नहीं किया गया है और उससे प्रॉपर्टी की लंबाई ऐक्सेस करने की कोशिश की जा रही है, तो यह गड़बड़ी की वजह है.
इस समस्या को बेहतर तरीके से समझने के लिए, आइए एक उदाहरण देखते हैं:
मान लें कि आपको बैकएंड सर्वर से यह JSON रिस्पॉन्स मिला है:
{ "cars": [ { "name":"Toyota", "count": 150 } { "name":"Honda", "count": 100 }, { "name":"Ford", "count": 75 } ] }यहां 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); }JavaScript कोड को ध्यान से देखने पर पता चलता है कि लाइन नंबर 2 में,
response.contentको वैरिएबलjsonDataमें रेगुलर स्ट्रिंग (कोटेशन मार्क में) के तौर पर पढ़ा/सेव किया जाता है.jsonDataएक सामान्य स्ट्रिंग है. इसलिए,jsonDataसेcarsको ऐक्सेस करने की कोशिश करने पर,jsonData.carsकी वैल्यू तय नहीं की जाएगी.इसके बाद, जब
jsonData.carsसेlengthप्रॉपर्टी को पढ़ने की कोशिश की जाती है, तो आपको यह गड़बड़ी मिलती है:"faultstring": "Execution of ParseJSONResponse failed with error: Javascript runtime error: \"TypeError: Cannot read property \"length\" from undefined. (ParseJSONResponse.js:6)\""
रिज़ॉल्यूशन
पक्का करें कि आपने JSON डेटा को हमेशा 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"
}
}
}
संक्रमण की जांच
JavaScript नीति, उसकी सोर्स फ़ाइल, गड़बड़ी वाली लाइन का नंबर, और गड़बड़ी के ब्यौरे की पहचान करें. यह सारी जानकारी, गड़बड़ी के जवाब के faultstring एलिमेंट में देखी जा सकती है. उदाहरण के लिए, यहां दिए गए faultstring में, 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की दूसरी लाइन में, गलत तरीके से बनाए गए यूआरआई सीक्वेंस का इस्तेमाल किया गया है.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);