คุณกําลังดูเอกสารประกอบของ 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
เมื่อคุณดำเนินการกับค่าหรือส่งค่าไปยังฟังก์ชันที่ไม่ได้อยู่ในชุดหรือช่วงของค่าที่อนุญาต
ตัวอย่างเช่น ข้อผิดพลาดนี้จะเกิดขึ้นในกรณีต่อไปนี้
- หากคุณใช้วันที่ไม่ถูกต้อง เช่น 31 ก.ย. 2018 กับ Date API บางรายการ
- หากคุณส่งค่าที่ไม่ถูกต้องไปยังเมธอดตัวเลข เช่น
Number.toPrecision()
,Number.tofixed()
หรือNumber.toExponential()
ตัวอย่างเช่น สมมติว่าคุณส่งค่าขนาดใหญ่ เช่น 400 หรือ 500 ในเมธอดNumber.toPrecision()
คุณจะเห็นข้อผิดพลาดของช่วง - ถ้าคุณสร้างอาร์เรย์ที่มีความยาวไม่ถูกต้อง
เนื้อหาการตอบกลับข้อผิดพลาด
{ "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 (ระบุไว้ในขั้นตอนที่ 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"
}
}
}
การวินิจฉัย
ระบุนโยบาย 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);
ในตัวอย่างนี้ โปรดสังเกตว่ามีการใช้ค่าขนาดใหญ่ 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"
}
}
}
การวินิจฉัย
ระบุนโยบาย 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 และยืนยันว่ามีการอ้างอิงตัวแปรที่ไม่มีการกําหนดค่าซึ่งระบุไว้ในขั้นตอนที่ 1 ด้านบนหรือไม่ ตัวอย่างเช่น โค้ด JavaScript ต่อไปนี้อ้างอิงตัวแปร
price
ที่ไม่รู้จักในบรรทัดที่ 3 ซึ่งตรงกับสิ่งที่อยู่ใน faultstringComputeTotalPrice.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 พบโทเค็นหรือลําดับโทเค็นที่ไม่เป็นไปตามไวยากรณ์ของภาษา หรือเมื่อส่งอินพุตรูปแบบที่ไม่ถูกต้องไปยัง 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"
}
}
}
การวินิจฉัย
ระบุนโยบาย 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 ในไฟล์ซอร์ส 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"
}
}
}
การวินิจฉัย
ระบุนโยบาย 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()
ในออบเจ็กต์ที่มีค่าตัวเลขเป็น 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"
}
}
}
การวินิจฉัย
ระบุนโยบาย 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 (ระบุไว้ในขั้นตอนที่ 1 ด้านบน) และยืนยันว่าออบเจ็กต์มีค่าที่ถูกต้องหรือไม่ได้รับการกำหนด คุณอาจต้องอ่านและทำความเข้าใจไฟล์ต้นฉบับที่สมบูรณ์เพื่อดูว่ามีการกำหนดหรือดึงออบเจ็กต์ดังกล่าวอย่างไร และระบุสาเหตุที่ระบุว่าไม่มีการระบุออบเจ็กต์ หากพบว่าออบเจ็กต์ที่เฉพาะเจาะจงนั้นไม่ได้กําหนดค่าไว้จริงๆ และคุณพยายามเข้าถึงความยาวของพร็อพเพอร์ตี้จากออบเจ็กต์ดังกล่าว แสดงว่านี่อาจเป็นสาเหตุของข้อผิดพลาด
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหานี้กัน
สมมติว่าคุณได้รับการตอบสนอง 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
เป็นสตริงทั่วไป เมื่อคุณพยายามเข้าถึงcars
จากjsonData
(jsonData.cars
) จะไม่มีการกําหนดค่าจากนั้นเมื่อคุณพยายามอ่านพร็อพเพอร์ตี้
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"
}
}
}
การวินิจฉัย
ระบุนโยบาย 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
ตรวจสอบไฟล์ต้นฉบับของ 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);