您正在查看 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 錯誤 | 如果您在 URI 函式中使用無效字元,系統會擲回 URIError。 |
範圍錯誤
當您對值執行操作,或將值傳遞至不屬於允許值集或範圍的函式時,系統會擲回錯誤類型 RangeError
。
舉例來說,在下列情況下,系統會擲回此錯誤:
- 如果您使用無效日期 (例如 2018 年 9 月 31 日) 搭配部分 Date API。
- 如果將無效值傳遞至數字方法,例如
Number.toPrecision()
、Number.tofixed()
或Number.toExponential()
,舉例來說,假設您在Number.toPrecision()
方法中傳遞 400 或 500 等大的值,就會看到範圍錯誤。 - 如果您建立的陣列長度不合法。
錯誤回應主體
{ "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();
在這個範例中,第 2 行使用了
date
變數。檢查來源檔案時,您會發現date
變數設定的日期無效:2018-09-31T11:19:08.402Z.
此日期無效,因為 9 月未滿 31 天。注意:本例使用的 ISO-8601 格式為:
YYYY-MM-DDTHH:mm:ss.sssZ
解析度
請務必一律使用有效日期,在 JavaScript 程式碼中使用 Date API。
如要修正上述 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);
在此範例中,請注意第 2 行使用較大的 400 值。由於您無法將精確度設為這麼多位數字,因此會收到以下錯誤:
"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);
參照錯誤
當您使用 (參照) 或操作 JavaScript 中的未定義變數時,系統會擲回錯誤類型 ReferenceError
。
錯誤回應主體
{ "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 程式碼會參照第 3 行中未定義的變數
price
,這與 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);
檢查 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);
語法錯誤
如果 JavaScript 引擎遇到不符合語言語法的符記或符記順序,或是將無效的格式輸入內容傳遞至剖析器 API (例如 JSON/XML 剖析器),就會擲回錯誤類型 SyntaxError
。
舉例來說,如果無效或格式錯誤的 JSON 酬載資料傳遞為 JavaScript 政策中使用的 JSON.parse
API 輸入內容,就會發生這個錯誤。
錯誤回應主體
{ "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)\""
請檢查 JavaScript 來源檔案中的第 2 行 (請參閱上述步驟 1),並查看執行的作業。如果正在執行
JSON.parse()
函式,請檢查傳遞給函式的輸入參數。如果輸入參數無效或格式錯誤,就會導致錯誤。發生這個錯誤的 JavaScript 程式碼範例如下:
var input = context.getVariable("request.content"); var result = JSON.parse(input);
在本例中,傳遞至 API Proxy 的要求酬載 (
request.content
) 會用做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 Proxy
<city>Bangalore</city>
。JSON.parse
API 預期會傳遞有效的 JSON,但由於傳遞的是 XML 酬載,因此會失敗並顯示以下錯誤:"Execution of ParseJSONRequest failed with error: Javascript runtime error: \"SyntaxError: Unexpected token: <. (ParseJSONRequest.js:2)\""
解析度
請務必將有效的輸入內容傳遞至 JavaScript 程式碼中使用的剖析 API。
如要修正上述範例政策的問題,請按照下列方式傳送有效的 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"
}
}
}
診斷
請指出 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)\""
錯誤說明指出,您在數值為 100 的物件上叫用
toUpperCase()
函式。請檢查 JavaScript 來源檔案,確認您是否在第 2 行 (如上方步驟 1 所述) 的物件上叫用
toUpperCase()
函式,該物件的數值為 100。如果是,就是發生錯誤的原因。以下是導致這項錯誤的 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 } ] }
以下是會剖析此 JSON 回應並導致上述錯誤的 JavaScript 來源檔案範例:
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
是一般字串,因此當您嘗試從jsonData
存取cars
時,jsonData.cars
會未定義。之後,如果您嘗試從
jsonData.cars
讀取未定義的屬性length
,就會收到錯誤訊息:"faultstring": "Execution of ParseJSONResponse failed with error: Javascript runtime error: \"TypeError: Cannot read property \"length\" from undefined. (ParseJSONResponse.js:6)\""
解析度
請確保一律使用相關 JSON API,以 JSON 物件形式讀取 JSON 資料。
如要修正上述 JavaScript 範例,您可以在 response.content
物件上使用 JSON.parse()
函式,將其取得為 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 錯誤
如果您在 URI 函式中使用無效字元,系統會擲回錯誤類型 URIError
。舉例來說,如果您將含有百分比符號的 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)\""
錯誤說明表示
URIDecode.js
的第 2 行使用了格式錯誤的 URI 序列。請檢查 JavaScript 來源檔案,確認傳遞至任何 URI 函式的引數是否含有任何無效字元。如果是的話,就是發生錯誤的原因。
以下是導致這項錯誤的 JavaScript 來源檔案範例:
URIDecode.js
var str = "75%-Completed"; var decoded_str = decodeURIComponent(str); context.setVariable("decoded_str", decoded_str);
在上述 JavaScript 程式碼範例中,傳遞至
decodeURIComponent()
的變數str
含有百分比符號,而這項符號屬於非法字元,因此會產生錯誤:"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);