การแก้ปัญหาข้อผิดพลาดของรันไทม์นโยบาย JavaScript

คุณกำลังดูเอกสารประกอบของ 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 ได้หลายประเภท ข้อผิดพลาดที่พบบ่อยบางส่วนแสดงอยู่ในตารางด้านล่าง

ประเภทข้อผิดพลาด สาเหตุ
ข้อผิดพลาดเกี่ยวกับช่วง ระบบจะแสดง 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 แสดง ตัวอย่าง 2 รายการอธิบายไว้ด้านล่างเพื่อให้คุณใช้อ้างอิง

ตัวอย่างที่ 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 ตัวอย่างที่แสดงด้านบน ให้กำหนดตัวแปร price ก่อนที่จะใช้ เช่น

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 จะเกิดขึ้นในกรณีต่อไปนี้

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

เช่น ระบบจะแสดงข้อผิดพลาดเกี่ยวกับประเภท

  • หากคุณพยายามเรียกใช้ฟังก์ชัน 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 ด้านบน) และยืนยันว่าออบเจ็กต์มีค่าที่ถูกต้องหรือไม่ได้กำหนด คุณอาจต้องอ่านและทำความเข้าใจไฟล์ต้นฉบับทั้งหมดเพื่อพิจารณาว่ามีการกำหนดหรือได้มาซึ่งออบเจ็กต์ที่เฉพาะเจาะจงอย่างไร และพิจารณาว่าเหตุใดระบบจึงพบว่าออบเจ็กต์ไม่ได้กำหนดไว้ หากพบว่าออบเจ็กต์ที่เฉพาะเจาะจงนั้นไม่ได้กำหนดไว้และคุณพยายามเข้าถึงพร็อพเพอร์ตี้ length จากออบเจ็กต์ดังกล่าว นั่นคือสาเหตุของข้อผิดพลาด

    มาดูตัวอย่างเพื่อทำความเข้าใจปัญหานี้ให้ดียิ่งขึ้น

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