排解 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 錯誤 如果您在 URI 函式中使用無效字元,系統會擲回 URIError

範圍錯誤

當您對值執行操作,或將值傳遞至不屬於允許值集或範圍的函式時,系統會擲回錯誤類型 RangeError

舉例來說,在下列情況下,系統會擲回此錯誤:

  1. 如果在部分 Date API 中使用了無效的日期 (例如 2018 年 9 月 31 日),
  2. 如果將無效值傳遞至數字方法,例如 Number.toPrecision()Number.tofixed()Number.toExponential(),舉例來說,假設您在 Number.toPrecision() 方法中傳遞 400 或 500 等大的值,就會看到範圍錯誤。
  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();
    

    在這個範例中,第 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"
        }
    }
}

診斷

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

    請注意,在本範例的 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"
        }
    }
}

診斷

  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 程式碼參照第 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);
    
    
  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);

語法錯誤

JavaScript 引擎遇到權杖時,系統會擲回錯誤類型 SyntaxError 不符合語言語法的符記順序 格式輸入內容會傳遞到剖析器 API,例如 JSON/XML 剖析

舉例來說,如果將無效或格式錯誤的 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"
        }
    }
}

診斷

  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. 檢查 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 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)\""
    

    錯誤說明指出您要對數值為 100 的物件叫用 toUpperCase() 函式。

  2. 檢查 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"
        }
    }
}

診斷

  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. 以下是會剖析此 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);
        }
      
    3. 仔細檢查 JavaScript 程式碼後,您會發現在第 2 行,response.content 會做為一般字串 (以引號括住) 讀取/儲存至變數 jsonData 中。

    4. 由於 jsonData 是一般字串,因此當您嘗試從 jsonData (jsonData.cars) 存取 cars 時,將未定義。

    5. 之後,如果您嘗試從 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 傳遞至 decodeURIdecodeURIComponent 函式,就會收到這個錯誤。

錯誤回應主體

{
    "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)\""
    

    錯誤說明表示 URIDecode.js 的第 2 行使用了格式錯誤的 URI 序列。

  2. 檢查 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);