การแก้ปัญหาข้อผิดพลาดของรันไทม์นโยบาย 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 อาจทำให้เกิดข้อผิดพลาด ScriptExecutionFailed ประเภทต่างๆ หลายประเภท ข้อผิดพลาดบางประการที่มักพบได้บ่อยแสดงอยู่ในตารางด้านล่าง

ประเภทข้อผิดพลาด สาเหตุ
ข้อผิดพลาดของช่วง อาจมีการส่ง RangeError หากคุณใช้ตัวเลขนอกช่วงของค่าทางกฎหมาย
ข้อผิดพลาดในการอ้างอิง มีการส่ง ReferenceError หากคุณใช้ (อ้างอิง) ตัวแปรที่ไม่ได้ประกาศไว้
ข้อผิดพลาดด้านไวยากรณ์ จะมีการส่ง SyntaxError ถ้าคุณพยายามประเมินโค้ดที่มีข้อผิดพลาดทางไวยากรณ์
ข้อผิดพลาดประเภท อาจมีการส่ง TypeError หากคุณใช้การดำเนินการนอกช่วงของประเภทที่คาดไว้
ข้อผิดพลาด URI อาจมีการส่ง URIError หากคุณใช้อักขระที่ไม่ถูกต้องในฟังก์ชัน URI

ข้อผิดพลาดของช่วง

ระบบจะแสดงข้อผิดพลาดประเภท RangeError เมื่อคุณดำเนินการกับค่าหรือส่งผ่านค่าไปยังฟังก์ชันที่ไม่อยู่ในชุดหรือช่วงของค่าที่อนุญาต

ตัวอย่างเช่น ข้อผิดพลาดนี้เกิดขึ้นในสถานการณ์ต่อไปนี้

  1. หากคุณใช้วันที่ที่ไม่ถูกต้อง เช่น 31 กันยายน 2018 พร้อมกับ API วันที่บางรายการ
  2. หากคุณส่งค่าที่ไม่ถูกต้องไปยังวิธีการที่เป็นตัวเลข เช่น Number.toPrecision(), Number.tofixed() หรือ Number.toExponential() ตัวอย่างเช่น สมมติว่าคุณส่งค่าขนาดใหญ่ เช่น 400 หรือ 500 ในเมธอด Number.toPrecision() คุณจะเห็นข้อผิดพลาดของช่วง
  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 ส่ง ตัวอย่าง 2-3 ตัวอย่างมีอธิบายไว้ด้านล่างเพื่อให้คุณใช้เป็นข้อมูลอ้างอิง

ตัวอย่างที่ 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();
    

    ในตัวอย่างนี้มีการใช้ตัวแปร date ในบรรทัดที่ 2 ขณะตรวจสอบไฟล์แหล่งที่มา คุณจะเห็นว่าตัวแปร date ได้รับการตั้งค่าเป็นวันที่ที่ไม่ถูกต้อง: 2018-09-31T11:19:08.402Z. วันที่นี้ไม่ถูกต้องเนื่องจากเดือนกันยายนไม่มี 31 วัน

    หมายเหตุ: รูปแบบ ISO-8601 ที่ใช้ในตัวอย่างนี้คือ YYYY-MM-DDTHH:mm:ss.sssZ

ความละเอียด

ตรวจสอบว่าคุณใช้วันที่ที่ถูกต้องเสมอขณะใช้ API วันที่ในโค้ด JavaScript

ในการแก้ไขตัวอย่างโค้ด JavaScript ที่แสดงข้างต้น ให้ตั้งค่าวันที่เป็น Sept 30 2018 ดังที่แสดงด้านล่าง

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

ตัวอย่างที่ 2: มีการส่งตัวเลขที่ไม่ถูกต้องไปยัง 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);
    

    ในตัวอย่างนี้ สังเกตว่ามีการใช้ค่า 400 จำนวนมากในบรรทัดที่ 2 เนื่องจากคุณตั้งค่าความแม่นยำเป็นตัวเลขจำนวนมากขนาดนั้นไม่ได้ คุณจึงจะได้รับข้อผิดพลาดต่อไปนี้

    "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 ต่อไปนี้อ้างอิงตัวแปร price ที่ไม่ได้กำหนดในบรรทัดที่ 3 ซึ่งตรงกับสิ่งที่อยู่ใน faultstring

    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 พบโทเค็นหรือลำดับโทเค็นที่ไม่เป็นไปตามไวยากรณ์ของภาษา หรือเมื่อมีการส่งอินพุตรูปแบบที่ไม่ถูกต้องไปยัง API โปรแกรมแยกวิเคราะห์ เช่น การแยกวิเคราะห์ JSON/XML

ตัวอย่างเช่น หากมีการส่งเพย์โหลด JSON ที่ไม่ถูกต้องหรือผิดรูปแบบเป็นอินพุตไปยัง JSON.parse API ที่ใช้ภายในนโยบาย JavaScript คุณจะได้รับข้อผิดพลาดนี้

เนื้อหาการตอบกลับข้อผิดพลาด

{
    "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. ตรวจสอบบรรทัดที่ 2 ในไฟล์ต้นฉบับ JavaScript (ระบุไว้ในขั้นตอนที่ 1 ด้านบน) และดูว่าระบบกำลังดำเนินการใด หากเรียกใช้ฟังก์ชัน JSON.parse() ให้ตรวจสอบพารามิเตอร์อินพุตที่ส่งผ่านไปยังฟังก์ชันดังกล่าว หากพารามิเตอร์อินพุตไม่ถูกต้องหรือ JSON มีรูปแบบไม่ถูกต้อง นั่นเป็นสาเหตุของข้อผิดพลาด

    ตัวอย่างโค้ด JavaScript ที่ทำให้เกิดข้อผิดพลาดนี้

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

    ในตัวอย่างนี้ เพย์โหลดคำขอ (request.content) ที่ส่งไปยังพร็อกซี API จะใช้เป็นอินพุตไปยังฟังก์ชัน JSON.parse()

    ต่อไปนี้คือตัวอย่างการเรียก API ที่แสดงให้เห็นว่ามีการส่งคำขออย่างไร

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

    ในคำขอข้างต้น ระบบจะส่งเพย์โหลด XML ต่อไปนี้ไปยังพร็อกซี API <city>Bangalore</city> JSON.parse API ต้องการที่จะส่งผ่าน JSON ที่ถูกต้อง แต่เนื่องจากมีการส่งเพย์โหลด XML แทน จึงล้มเหลวโดยมีข้อผิดพลาดต่อไปนี้

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

ความละเอียด

โปรดตรวจสอบว่าได้ส่งอินพุตที่ถูกต้องไปยัง API การแยกวิเคราะห์ที่ใช้ในโค้ด 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() เรียกใช้ได้เฉพาะในออบเจ็กต์สตริงเท่านั้น
  • กรณีที่พยายามอ่านพร็อพเพอร์ตี้จากออบเจ็กต์ที่ไม่ได้ระบุหรือ Null

เนื้อหาการตอบกลับข้อผิดพลาด

{
    "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"
        }
    }
}

การวินิจฉัย

  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() ในออบเจ็กต์ที่มีค่าตัวเลขเป็น 100 ที่บรรทัดที่ 2 (ระบุในขั้นตอนที่ 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();

ตัวอย่างที่ 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 เป็นสตริงทั่วไป เมื่อคุณพยายามเข้าถึง cars จาก jsonData (jsonData.cars) จะไม่มีการกำหนด

    5. หลังจากนี้ เมื่อคุณพยายามอ่านพร็อพเพอร์ตี้ length จาก jsonData.cars ซึ่งไม่มีการกำหนด คุณจะได้รับข้อผิดพลาด

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

ความละเอียด

ตรวจสอบว่าคุณอ่านข้อมูล JSON เป็นออบเจ็กต์ JSON โดยใช้ API ของ JSON ที่เกี่ยวข้องเสมอ

หากต้องการแก้ไขตัวอย่าง JavaScript ที่อธิบายไว้ข้างต้น คุณสามารถใช้ฟังก์ชัน JSON.parse() ในออบเจ็กต์ response.content เพื่อรับเป็นออบเจ็กต์ 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);
}

ข้อผิดพลาด URI

ระบบจะแสดงข้อผิดพลาดประเภท URIError ถ้าคุณใช้อักขระที่ไม่ถูกต้องในฟังก์ชัน URI ตัวอย่างเช่น หากคุณส่ง URI ที่มีสัญลักษณ์เปอร์เซ็นต์ไปยังฟังก์ชัน 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 ไฟล์แหล่งที่มา หมายเลขบรรทัดที่เกิดข้อผิดพลาด และคำอธิบายข้อผิดพลาด คุณสามารถดูข้อมูลทั้งหมดนี้ใน องค์ประกอบ 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)\""
    

    คำอธิบายข้อผิดพลาดระบุว่ามีการใช้ลำดับ URI ที่มีรูปแบบไม่ถูกต้องในบรรทัดที่ 2 ของ URIDecode.js

  2. ตรวจสอบไฟล์ซอร์สของ JavaScript และยืนยันว่าอาร์กิวเมนต์ที่ส่งไปยังฟังก์ชัน URI มีอักขระที่ไม่ถูกต้องหรือไม่ หากใช่ นั่นเป็นสาเหตุของข้อผิดพลาด

    ตัวอย่างไฟล์ JavaScript ต้นฉบับที่ทำให้เกิดข้อผิดพลาดนี้

    URIDecode.js

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

    ในตัวอย่างโค้ด JavaScript ที่แสดงด้านบน ตัวแปร str ที่ส่งไปยัง decodeURIComponent() มีสัญลักษณ์เปอร์เซ็นต์ซึ่งถือเป็นอักขระที่ไม่ถูกต้อง ดังนั้นคุณจะได้รับข้อผิดพลาด

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

ความละเอียด

ตรวจสอบว่าอักขระทั้งหมดที่ใช้ในฟังก์ชัน URI ถูกกฎหมายและได้รับอนุญาต

หากต้องการแก้ไขปัญหาในตัวอย่าง JavaScript ที่อธิบายไว้ข้างต้น ให้ใช้การเข้ารหัสสัญลักษณ์เปอร์เซ็นต์ เช่น %25

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