查看 Apigee Edge 說明文件。
前往
Apigee X說明文件。 資訊
ScriptExecutionFailed
錯誤代碼
steps.javascript.ScriptExecutionFailed
錯誤回應主體
{ "fault": { "faultstring": "Execution ofjavascript_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
。
舉例來說,在下列情況下,系統會擲回此錯誤:
- 如果在部分 Date API 中使用了無效的日期 (例如 2018 年 9 月 31 日),
- 如果將無效值傳遞至數字方法,例如
Number.toPrecision()
、Number.tofixed()
或Number.toExponential()
,舉例來說,假設您在Number.toPrecision()
方法中傳遞 400 或 500 等大的值,就會看到範圍錯誤。 - 如果您建立長度不合的陣列。
錯誤回應主體
{ "fault": { "faultstring": "Execution ofjavascript_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 ofjavascript_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
,與錯誤字串中的內容相符: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 引擎遇到權杖時,系統會擲回錯誤類型 SyntaxError
不符合語言語法的符記順序
格式輸入內容會傳遞到剖析器 API,例如 JSON/XML 剖析
舉例來說,如果將無效或格式錯誤的 JSON 酬載當做輸入內容傳送至 JavaScript 政策中所用 JSON.parse
API,就會出現這個錯誤。
錯誤回應主體
{ "fault": { "faultstring": "Execution ofjavascript_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()
函式,請檢查傳遞至函式的輸入參數。如果輸入參數無效或格式錯誤的 JSON,這就是發生錯誤的原因。發生這個錯誤的 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 ofjavascript_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 所示) 對數值為 100 的物件叫用
toUpperCase()
函式。如果是,就是發生錯誤的原因。以下是引發這個錯誤的 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
(jsonData.cars
) 存取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 ofjavascript_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 元素。例如,在下列 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);