Pemecahan masalah error runtime kebijakan JavaScript

Anda sedang melihat dokumentasi Apigee dan Apigee hybrid.
Lihat dokumentasi Apigee Edge.

ScriptExecutionFailed

Kode error

steps.javascript.ScriptExecutionFailed

Isi respons error

{
    "fault": {
        "faultstring": "Execution of javascript_policy_name failed with error: error_type: error_description. (javascript_source_file_name)\"",
        "detail": {
            "errorcode": "steps.javascript.ScriptExecutionFailed"
        }
    }
}

Jenis Error dan kemungkinan penyebabnya

Kebijakan JavaScript dapat menampilkan berbagai jenis error ScriptExecutionFailed. Beberapa error yang lebih sering terlihat tercantum dalam tabel di bawah:

Jenis Error Penyebab
Error Rentang RangeError ditampilkan jika Anda menggunakan angka yang berada di luar rentang nilai yang valid.
Error Referensi ReferenceError ditampilkan jika Anda menggunakan (mereferensikan) variabel yang belum dideklarasikan.
Error Sintaksis SyntaxError ditampilkan jika Anda mencoba mengevaluasi kode dengan error sintaksis.
Error Jenis TypeError ditampilkan jika Anda menggunakan operasi yang berada di luar rentang jenis yang diharapkan.
Error URI URIError ditampilkan jika Anda menggunakan karakter yang tidak sah dalam fungsi URI.

Error rentang

Jenis error RangeError ditampilkan saat Anda mengoperasikan nilai atau meneruskan nilai ke fungsi yang tidak ada dalam kumpulan atau rentang nilai yang diizinkan.

Misalnya, error ini ditampilkan dalam situasi berikut:

  1. Jika Anda menggunakan tanggal yang tidak valid seperti 31 September 2018 dengan beberapa Date API.
  2. Jika Anda meneruskan nilai yang tidak valid ke metode numerik seperti Number.toPrecision(), Number.tofixed(), atau Number.toExponential(). Misalnya, jika Anda meneruskan nilai besar seperti 400 atau 500 dalam metode Number.toPrecision(), Anda akan melihat error rentang.
  3. Jika Anda membuat array dengan panjang yang tidak valid.

Isi respons error

{
    "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"
        }
    }
}

Catatan: Diagnosis dan penyelesaian error rentang bergantung pada pesan error yang tepat yang ditampilkan oleh kebijakan JavaScript. Beberapa contoh dijelaskan di bawah ini sebagai referensi Anda.

Contoh 1: Tanggal Tidak Valid

Contoh isi respons error

{
    "fault": {
        "faultstring": "Execution of ParseDate failed with error: Javascript runtime error: \"RangeError: Date is invalid. (ParseDate.js:2)\"",
        "detail": {
            "errorcode": "steps.javascript.ScriptExecutionFailed"
        }
    }
}

Diagnosis

  1. Identifikasi kebijakan JavaScript, file sumbernya, nomor baris tempat error terjadi, dan deskripsi error. Anda dapat menemukan semua informasi ini di elemen faultstring respons error. Misalnya, dalam faultstring berikut, nama kebijakan JavaScript adalah ParseDate, file sumber JavaScript adalah ParseDate.js, nomor baris tempat error terjadi adalah 2, dan deskripsi error adalah Date is invalid:

    "faultstring": "Execution of ParseDate failed with error: Javascript runtime error: \"RangeError: Date is invalid. (ParseDate.js:2)\""
    
  2. Periksa file sumber JavaScript (diidentifikasi pada langkah #1 di atas) dan periksa apakah ada tanggal tidak valid yang digunakan di nomor baris yang ditentukan dalam error atau apakah variabel yang digunakan di nomor baris memiliki tanggal tidak valid. Jika tanggal yang digunakan tidak valid, hal itu adalah penyebab error.

    Berikut adalah contoh file sumber JavaScript yang menyebabkan error ini:

    ParseDate.js

    var date = new Date('2018-09-31T11:19:08.402Z');
    date.toISOString();
    

    Dalam contoh ini, ada variabel date yang digunakan di baris nomor 2. Dengan memeriksa file sumber, Anda dapat melihat bahwa variabel date ditetapkan dengan tanggal yang tidak valid: 2018-09-31T11:19:08.402Z. Tanggal ini tidak valid karena bulan September tidak memiliki 31 hari.

    Catatan: Format ISO-8601 yang digunakan dalam contoh ini adalah: YYYY-MM-DDTHH:mm:ss.sssZ

Resolusi

Pastikan Anda selalu menggunakan tanggal yang valid saat menggunakan Date API dalam kode JavaScript.

Untuk memperbaiki contoh kode JavaScript yang ditampilkan di atas, Anda dapat menetapkan tanggal sebagai Sept 30 2018 seperti yang ditunjukkan di bawah:

var date = new Date('2018-09-30T11:19:08.402Z');
date.toISOString();

Contoh 2: Nomor yang tidak valid diteruskan ke Precision API

Contoh isi respons error

{
    "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"
        }
    }
}

Diagnosis

  1. Identifikasi kebijakan JavaScript, file sumbernya, nomor baris tempat error terjadi, dan deskripsi error. Anda dapat menemukan semua informasi ini di elemen faultstring respons error. Misalnya, dalam faultstring berikut, nama kebijakan JavaScript adalah SetNumberPrecision, file sumber JavaScript adalah SetNumberPrecision.js, nomor baris tempat error terjadi adalah 2, dan deskripsi error adalah 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. Periksa file sumber JavaScript (diidentifikasi pada langkah #1 di atas). Jika angka besar yang disebutkan sebagai bagian dari deskripsi error digunakan di nomor baris tertentu, maka itulah penyebab error.

    Berikut adalah contoh file sumber JavaScript yang menyebabkan error ini:

    SetNumberPrecision.js

    var number = 12.3456;
    var rounded_number = number.toPrecision(400);
    print("rounded_number = " + rounded_number);
    

    Dalam contoh ini, perhatikan bahwa nilai besar 400 digunakan di baris nomor 2. Karena Anda tidak dapat menetapkan presisi ke angka yang begitu banyak, Anda akan mendapatkan error di bawah ini:

    "faultstring": "Execution of SetNumberPrecision failed with error: Javascript runtime error: "RangeError: Precision 400 out of range. (SetNumberPrecision.js:2)\""
    

Resolusi

Pastikan angka yang digunakan dalam metode toPrecision() berada dalam kumpulan nilai yang diizinkan.

Untuk memperbaiki masalah pada contoh JavaScript yang dijelaskan di atas, tetapkan jumlah digit signifikan ke 2 yang valid:

var number = 12.3456;
var rounded_number = number.toPrecision(2);
print("rounded_number = " + rounded_number);

Error referensi

Jenis error ReferenceError ditampilkan saat variabel yang tidak ditentukan dalam JavaScript Anda digunakan (direferensikan) atau dioperasikan.

Isi respons error

{
    "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"
        }
    }
}

Contoh isi respons error

{
    "fault": {
        "faultstring": "Execution of ComputeTotalPrice failed with error: Javascript runtime error: \"ReferenceError: \"price\" is not defined. (ComputeTotalPrice.js:3)\"",
        "detail": {
            "errorcode": "steps.javascript.ScriptExecutionFailed"
        }
    }
}

Diagnosis

  1. Identifikasi kebijakan JavaScript, file sumbernya, dan nomor baris tempat variabel yang tidak ditentukan dirujuk. Anda dapat menemukan semua informasi ini di elemen faultstring respons error. Misalnya, dalam faultstring berikut, nama kebijakan JavaScript adalah ComputeTotalPrice, file sumber yang sesuai adalah ComputeTotalPrice.js, nomor baris tempat error terjadi adalah 3, dan nama variabel yang tidak ditentukan adalah price.

    "faultstring": "Execution of ComputeTotalPrice failed with error: Javascript runtime error: \"ReferenceError: \"price\" is not defined. (ComputeTotalPrice.js:3)\""
    
  2. Periksa nomor baris dalam file sumber JavaScript dan verifikasi apakah variabel yang tidak ditentukan yang diidentifikasi pada langkah #1 di atas sedang dirujuk. Misalnya, kode JavaScript berikut mereferensikan variabel price yang tidak ditentukan di baris 3, yang cocok dengan yang ada di 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. Periksa apakah variabel tertentu ditentukan dalam kode JavaScript. Jika variabel tidak ditentukan, hal itu adalah penyebab error.

    Dalam contoh skrip yang ditampilkan di atas, variabel price yang tidak dideklarasikan/ditentukan digunakan; oleh karena itu, Anda akan melihat error di bawah:

    "faultstring": "Execution of ComputeTotalPrice failed with error: Javascript runtime error: \"ReferenceError: \"price\" is not defined. (ComputeTotalPrice.js:3)\""
    

Resolusi

Pastikan semua variabel yang dirujuk dalam kode JavaScript ditentukan dengan benar.

Untuk memperbaiki masalah pada contoh JavaScript yang ditampilkan di atas, tentukan harga variabel sebelum menggunakannya. Contoh:

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

Error sintaksis

Jenis error SyntaxError ditampilkan saat mesin JavaScript menemukan token atau urutan token yang tidak sesuai dengan sintaksis bahasa, atau saat input format yang tidak valid diteruskan ke API parser seperti penguraian JSON/XML.

Misalnya, jika payload JSON yang tidak valid atau salah format diteruskan sebagai input ke JSON.parse API yang digunakan dalam kebijakan JavaScript, Anda akan mendapatkan error ini.

Isi respons error

{
    "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"
        }
    }
}

Contoh isi respons error

{
    "fault": {
        "faultstring": "Execution of ParseJSONRequest failed with error: Javascript runtime error: \"SyntaxError: Unexpected token: <. (ParseJSONRequest.js:2)\"",
        "detail": {
            "errorcode": "steps.javascript.ScriptExecutionFailed"
        }
    }
}

Diagnosis

  1. Identifikasi kebijakan JavaScript, file sumbernya, nomor baris tempat error terjadi, dan deskripsi error. Anda dapat menemukan semua informasi ini di elemen faultstring respons error. Misalnya, dalam faultstring berikut, nama kebijakan JavaScript adalah ParseJSONRequest, file sumber JavaScript adalah ParseJSONRequest.js, nomor baris tempat error terjadi adalah 2, dan deskripsi error adalah Unexpected token:

    "faultstring": "Execution of ParseJSONRequest failed with error: Javascript runtime error: \"SyntaxError: Unexpected token: <. (ParseJSONRequest.js:2)\""
    
  2. Periksa nomor baris 2 di file sumber JavaScript (diidentifikasi pada langkah #1 di atas) dan periksa operasi yang sedang dilakukan. Jika fungsi JSON.parse() sedang dieksekusi, periksa parameter input yang diteruskan ke fungsi tersebut. Jika parameter input tidak valid atau JSON-nya salah format, hal tersebut adalah penyebab error.

    Berikut adalah contoh kode JavaScript yang menyebabkan error ini:

    var input = context.getVariable("request.content");
    var result = JSON.parse(input);
    

    Dalam contoh ini, payload permintaan (request.content) yang diteruskan ke API Proxy digunakan sebagai input untuk fungsi JSON.parse().

    Berikut adalah contoh panggilan API yang menunjukkan cara permintaan diteruskan:

    curl -v "http://<org>-<env>.apigee.net/v1/js-demo" -H "Content-Type: application/json" -X POST -d '<city>Bangalore</city>'
    

    Dalam permintaan di atas, payload XML berikut diteruskan ke Proxy API <city>Bangalore</city>. JSON.parse API mengharapkan JSON yang valid diteruskan, tetapi karena payload XML yang diteruskan, API akan gagal dengan error di bawah:

    "Execution of ParseJSONRequest failed with error: Javascript runtime error: \"SyntaxError: Unexpected token: <. (ParseJSONRequest.js:2)\""
    

Resolusi

Pastikan untuk meneruskan input yang valid ke API penguraian yang digunakan dalam kode JavaScript.

Untuk memperbaiki masalah pada contoh kebijakan yang dibahas di atas, teruskan permintaan payload JSON yang valid sebagai berikut:

curl -v "http://<org>-<env>.apigee.net/v1/js-demo" -H "Content-Type: application/json" -X POST -d '{"city" : "Bangalore"}'

Error jenis

Jenis error TypeError ditampilkan saat:

  • Operand atau argumen yang diteruskan ke fungsi tidak kompatibel dengan jenis yang diharapkan oleh operator atau fungsi tersebut.
  • Fungsi dipanggil pada objek null, tidak ditentukan, atau salah.
  • Properti diakses dari objek null, tidak ditentukan, atau salah.

Misalnya, error jenis ditampilkan:

  • Jika Anda mencoba memanggil fungsi toUpperCase() pada angka. Hal ini karena fungsi toUpperCase() hanya dapat dipanggil pada objek string.
  • Jika Anda mencoba membaca properti dari objek null atau belum ditentukan.

Isi respons error

{
    "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"
        }
    }
}

Contoh 1: Memanggil fungsi pada objek yang salah

Jika Anda mencoba memanggil fungsi pada objek yang tidak didukung, Anda akan mendapatkan error ini. Misalnya, jika Anda mencoba memanggil fungsi toUpperCase() pada angka, Anda akan mendapatkan error. Hal ini karena fungsi toUpperCase() hanya dapat dipanggil pada objek string.

Contoh isi respons error

{
    "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"
        }
    }
}

Diagnosis

  1. Identifikasi kebijakan JavaScript, file sumbernya, nomor baris tempat error terjadi, dan deskripsi error. Anda dapat menemukan semua informasi ini di elemen faultstring respons error. Misalnya, dalam faultstring berikut, nama kebijakan JavaScript adalah ConvertToUpperCase, file sumber adalah ConvertToUpperCase.js, nomor baris adalah 2, dan deskripsi error adalah **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)\""
    

    Deskripsi error menunjukkan bahwa Anda memanggil fungsi toUpperCase() pada objek yang nilai numeriknya adalah 100.

  2. Periksa file sumber JavaScript dan verifikasi apakah Anda memanggil fungsi toUpperCase() pada objek yang nilai numeriknya adalah 100 di nomor baris 2 (diidentifikasi pada langkah # 1 di atas). Jika ya, berarti itulah penyebab error.

    Berikut adalah contoh file sumber JavaScript yang menyebabkan error ini:

    ConvertToUpperCase.js

    var number = 100;
    var result = number.toUpperCase();
    

    Dalam kode JavaScript yang ditampilkan di atas, variabel number ditetapkan dengan nilai 100. Selanjutnya, fungsi toUpperCase()( dipanggil pada objek angka. Karena fungsi toUpperCase() hanya dapat dipanggil pada objek string, Anda akan mendapatkan error:

    "Execution of ConvertToUpperCase failed with error: Javascript runtime error: \"TypeError: Cannot find function toUpperCase in object 100. (ConvertToUpperCase.js:2)\""
    

Resolusi

Selalu gunakan fungsi seperti toUpperCase() pada objek yang valid.

Untuk memperbaiki contoh yang ditampilkan di atas, Anda dapat membuat variabel string, lalu memanggil fungsi toUpperCase() pada string:

var text = "Hello Apigee !";
var result = text.toUpperCase();

Contoh 2: Tidak dapat membaca properti dari objek yang tidak ditentukan

Jika Anda mencoba mengakses/membaca properti dari objek yang tidak ditentukan, Anda akan mendapatkan error ini. Misalnya, error ini dapat terjadi saat Anda mencoba mengakses data dari objek dalam array, tetapi objek tidak ditentukan. Lihat penjelasan mendetail di bawah.

Contoh isi respons error

{
    "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"
        }
    }
}

Diagnosis

  1. Identifikasi kebijakan JavaScript, file sumbernya, nomor baris tempat error terjadi, dan deskripsi error. Anda dapat menemukan semua informasi ini di elemen faultstring respons error. Misalnya, dalam faultstring berikut, nama kebijakan adalah ParseJSONResponse, file sumber adalah ParseJSONResponse.js, nomor baris adalah 6, dan deskripsi error adalah 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)\""
    

    Error ini menunjukkan bahwa properti length tidak dapat dibaca dari objek yang tidak ditentukan.

  2. Periksa nomor baris dalam file sumber JavaScript (diidentifikasi pada langkah #1 di atas) dan verifikasi apakah objek memiliki nilai yang valid atau tidak ditentukan. Anda mungkin harus membaca dan memahami file sumber lengkap untuk menentukan cara objek tertentu ditentukan atau diturunkan dan menentukan alasan objek tersebut tidak ditemukan. Jika Anda mendapati bahwa objek tertentu memang tidak ditentukan dan Anda mencoba mengakses panjang properti dari objek tersebut, hal itulah yang menyebabkan error.

    Mari kita lihat contoh untuk lebih memahami masalah ini:

    1. Anggaplah Anda menerima respons JSON berikut dari server backend:

      {
          "cars": [
             { "name":"Toyota", "count": 150 }
             { "name":"Honda", "count": 100 },
             { "name":"Ford", "count": 75 }
          ]
      }
      
    2. Berikut adalah contoh file sumber JavaScript yang mengurai respons JSON ini dan menyebabkan error yang disebutkan di atas:

      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. Dengan memeriksa kode JavaScript dengan cermat, Anda dapat melihat bahwa di baris nomor 2, response.content dibaca/disimpan ke variabel jsonData sebagai string reguler (dalam tanda kutip).

    4. Karena jsonData adalah string reguler, saat Anda mencoba mengakses cars dari jsonData (jsonData.cars) tidak akan ditentukan.

    5. Selanjutnya, saat Anda mencoba membaca properti length dari jsonData.cars, yang tidak ditentukan, Anda akan mendapatkan error:

      "faultstring": "Execution of ParseJSONResponse failed with error: Javascript runtime error: \"TypeError: Cannot read property \"length\" from undefined. (ParseJSONResponse.js:6)\""
      

Resolusi

Pastikan Anda selalu membaca data JSON sebagai objek JSON menggunakan JSON API yang relevan.

Untuk memperbaiki contoh JavaScript yang dijelaskan di atas, Anda dapat menggunakan fungsi JSON.parse() pada objek response.content untuk mendapatkannya sebagai objek JSON. Setelah itu, Anda dapat mengakses array cars dan melakukan iterasi melalui array dengan sukses.

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

Error URI

Jenis error URIError ditampilkan jika Anda menggunakan karakter ilegal dalam fungsi URI. Misalnya, jika Anda meneruskan URI yang memiliki simbol persentase ke fungsi decodeURI atau decodeURIComponent, Anda akan mendapatkan error ini.

Isi respons error

{
    "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"
        }
    }
}

Contoh isi respons error

{
    "fault": {
        "faultstring": "Execution of URIDecode failed with error: Javascript runtime error: \"URIError: Malformed URI sequence. (URIDecode.js:2)\"",
        "detail": {
            "errorcode": "steps.javascript.ScriptExecutionFailed"
        }
    }
}

Diagnosis

  1. Identifikasi kebijakan JavaScript, file sumbernya, nomor baris tempat error terjadi, dan deskripsi error. Anda dapat menemukan semua informasi ini di elemen faultstring respons error. Misalnya, dalam faultstring berikut, nama kebijakan JavaScript adalah URIDecode</code, file sumber JavaScript adalah URIDecode.js, nomor baris adalah 2, dan deskripsi error adalah Malformed URI sequence:

    "faultstring": "Execution of URIDecode failed with error: Javascript runtime error: \"URIError: Malformed URI sequence. (URIDecode.js:2)\""
    

    Deskripsi error menunjukkan bahwa urutan URI yang salah formatnya digunakan di baris nomor 2 dari URIDecode.js.

  2. Periksa file sumber JavaScript dan verifikasi apakah argumen yang diteruskan ke salah satu fungsi URI berisi karakter ilegal. Jika ya, berarti itulah penyebab error.

    Berikut adalah contoh file sumber JavaScript yang menyebabkan error ini:

    URIDecode.js

    var str = "75%-Completed";
    var decoded_str = decodeURIComponent(str);
    context.setVariable("decoded_str", decoded_str);
    

    Dalam contoh kode JavaScript yang ditampilkan di atas, variabel str yang diteruskan ke decodeURIComponent() memiliki simbol persentase, yang dianggap sebagai karakter ilegal; oleh karena itu, Anda mendapatkan error:

    "Execution of URIDecode failed with error: Javascript runtime error: \"URIError: Malformed URI sequence. (URIDecode.js:2)\""
    

Resolusi

Pastikan semua karakter yang digunakan dalam fungsi URI sah dan diizinkan.

Untuk memperbaiki masalah pada contoh JavaScript yang dijelaskan di atas, gunakan simbol persentase yang dienkode. Misalnya, %25:

var str = "75%25-Completed";
var decoded_str = decodeURIComponent(str);
context.setVariable("decoded_str", decoded_str);