การแก้ปัญหาข้อผิดพลาดของรันไทม์นโยบาย 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 กับ Date 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 โปรดดูตัวอย่างด้านล่างเพื่อเป็นข้อมูลอ้างอิง

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

ความละเอียด

โปรดตรวจสอบวันที่ที่ถูกต้องเสมอในขณะที่ใช้ Date 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 จะแสดงเมื่อ:

  • ตัวถูกดำเนินการหรืออาร์กิวเมนต์ที่ส่งไปยังฟังก์ชันไม่สามารถใช้ร่วมกับประเภทที่โอเปอเรเตอร์หรือฟังก์ชันดังกล่าวต้องการ
  • เรียกใช้ฟังก์ชันกับออบเจ็กต์ Null, ไม่ได้ระบุ หรือไม่ถูกต้อง
  • มีการเข้าถึงพร็อพเพอร์ตี้จากออบเจ็กต์ที่ไม่มีข้อมูล ไม่ได้กำหนด หรือไม่ถูกต้อง

เช่น แสดงข้อผิดพลาดประเภท

  • หากคุณพยายามเรียกใช้ฟังก์ชัน 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"
        }
    }
}

การวินิจฉัย

  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 โดยใช้ JSON API ที่เกี่ยวข้องเสมอ

หากต้องการแก้ไขตัวอย่าง 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 ของการตอบสนองข้อผิดพลาด ตัวอย่างเช่น ในกรณีต่อไปนี้ 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);