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

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

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

{
    "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 ของคำตอบข้อผิดพลาด ตัวอย่างเช่น ในสตริงข้อผิดพลาดต่อไปนี้ ชื่อนโยบาย 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);