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 kesalahan yang lebih sering ditemui tercantum dalam tabel di bawah:

Jenis Error Penyebab
Error Rentang RangeError ditampilkan jika Anda menggunakan angka yang berada di luar rentang nilai resmi.
Error Referensi ReferenceError muncul jika Anda menggunakan (referensi) variabel yang belum dideklarasikan.
Error Sintaksis SyntaxError ditampilkan jika Anda mencoba mengevaluasi kode yang memiliki 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 terlarang dalam fungsi URI.

Error rentang

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

Misalnya, error ini ditampilkan dalam keadaan 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, 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 sah.

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 persis yang ditampilkan oleh kebijakan JavaScript. Beberapa contoh dijelaskan di bawah 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 terjadinya error, dan deskripsi error. Anda dapat menemukan semua informasi ini dalam 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 (yang diidentifikasi pada langkah #1 di atas) dan periksa apakah ada tanggal yang tidak valid digunakan di nomor baris yang ditetapkan dalam error atau apakah variabel yang digunakan dalam nomor baris memiliki tanggal yang tidak valid. Jika tanggal yang tidak valid digunakan, berarti itulah 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 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 ini:

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

Contoh 2: Nomor tidak valid yang 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 dalam 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 (yang diidentifikasi pada langkah #1 di atas). Jika jumlah besar yang disebutkan sebagai bagian dari deskripsi error digunakan dalam 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 jumlah digit yang besar, Anda mendapatkan error di bawah:

    "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 angka penting 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 di 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 direferensikan. Anda dapat menemukan semua informasi ini dalam 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 di file sumber JavaScript dan pastikan variabel yang tidak ditentukan yang diidentifikasi pada langkah #1 di atas direferensikan. Misalnya, kode JavaScript berikut merujuk ke variabel price yang tidak ditentukan di baris 3, yang cocok dengan apa 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 telah ditetapkan dalam kode JavaScript. Jika variabel tidak ditentukan, berarti itulah penyebab error.

    Pada 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 direferensikan dalam kode JavaScript ditetapkan 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 dalam 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 baris nomor 2 di file sumber JavaScript (yang diidentifikasi pada langkah #1 di atas) dan periksa operasi apa yang sedang dilakukan. Jika fungsi JSON.parse() sedang dieksekusi, periksa parameter input yang diteruskan ke fungsi tersebut. Jika parameter input tidak valid atau format JSON salah, berarti itulah 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 Proxy API 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, payload gagal dengan error di bawah ini:

    "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 jika:

  • 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, muncul error jenis:

  • Jika Anda mencoba memanggil fungsi toUpperCase() pada suatu angka. Hal ini karena fungsi toUpperCase() hanya dapat dipanggil pada objek string.
  • Jika Anda mencoba membaca properti dari objek null atau yang tidak 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 dalam elemen faultstring respons error. Misalnya, dalam faultstring berikut, nama kebijakan JavaScript adalah ConvertToUpperCase, file sumbernya adalah ConvertToUpperCase.js, nomor barisnya adalah 2, dan deskripsi error-nya 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 100.

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

    Berikut adalah contoh file sumber JavaScript yang menyebabkan error ini:

    ConvertToUpperCase.js

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

    Pada kode JavaScript yang ditampilkan di atas, variabel number ditetapkan dengan nilai 100. Selanjutnya, fungsi toUpperCase()( akan 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 ditunjukkan 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 ini.

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 terjadinya error, dan deskripsi error. Anda dapat menemukan semua informasi ini dalam elemen faultstring respons error. Misalnya, dalam faultstring berikut, nama kebijakannya adalah ParseJSONResponse, file sumbernya adalah ParseJSONResponse.js, nomor barisnya adalah 6, dan deskripsi error-nya 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 menunjukkan bahwa properti length tidak dapat dibaca dari objek yang tidak ditentukan.

  2. Periksa nomor baris di file sumber JavaScript (yang 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 bagaimana objek tertentu didefinisikan atau diturunkan dan menentukan mengapa objek tersebut didapati tidak terdefinisi. Jika Anda menemukan bahwa objek tertentu memang tidak ditentukan dan Anda mencoba mengakses panjang properti darinya, itulah penyebab error.

    Mari kita lihat contoh untuk lebih memahami masalah ini:

    1. Asumsikan bahwa 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 biasa (dalam tanda kutip).

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

    5. Selanjutnya, saat 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 akan berhasil mengakses array cars dan melakukan iterasi melalui array.

// 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 menerima 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 dari 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 dengan format yang salah digunakan dalam baris nomor 2 URIDecode.js.

  2. Periksa file sumber JavaScript dan pastikan argumen yang diteruskan ke salah satu fungsi URI berisi karakter yang tidak sah. Jika ya, maka 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);
    

    Pada 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 enkode simbol persentase. Misalnya, %25:

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