Pemecahan masalah error runtime kebijakan JavaScript

Anda sedang melihat dokumentasi Apigee Edge.
Buka Dokumentasi Apigee X.
info

ini.

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 Cause
Error Rentang RangeError ditampilkan jika Anda menggunakan angka yang berada di luar rentang nilai yang sah.
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 ilegal dalam fungsi URI.

Kesalahan rentang

Jenis error RangeError ditampilkan saat Anda mengoperasikan nilai atau meneruskan nilai ke fungsi yang tidak berada dalam set 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 error terjadi, dan deskripsi error. Anda dapat menemukan semua informasi ini di elemen faultstring respons error. Misalnya, di faultstring berikut, nama kebijakan JavaScript adalah ParseDate, file sumber JavaScript adalah ParseDate.js, nomor baris tempat error terjadi adalah 2, dan deskripsi error-nya 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, itulah penyebab errornya.

    Berikut 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 ditunjukkan di atas, Anda dapat menetapkan tanggal seperti 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 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, di faultstring berikut, nama kebijakan JavaScript adalah SetNumberPrecision, file sumber JavaScript adalah SetNumberPrecision.js, nomor baris tempat error terjadi adalah 2, dan deskripsi error-nya 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 angka besar yang disebutkan sebagai bagian dari deskripsi error digunakan di nomor baris tertentu, maka itulah penyebab error.

    Berikut 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 yang 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 direferensikan. Anda dapat menemukan semua informasi ini di elemen faultstring respons error. Misalnya, di 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 di langkah #1 di atas, direferensikan. Misalnya, kode JavaScript berikut merujuk ke variabel yang tidak ditentukan price 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 telah ditentukan dalam kode JavaScript. Jika variabel tidak ditentukan, maka itulah 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 ditetapkan dengan benar.

Untuk memperbaiki masalah pada contoh JavaScript yang ditunjukkan 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 sintaks bahasa, atau ketika format yang 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, di faultstring berikut, nama kebijakan JavaScript adalah ParseJSONRequest, file sumber JavaScript adalah ParseJSONRequest.js, nomor baris tempat error terjadi adalah 2, dan deskripsi error-nya 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 dijalankan. Jika fungsi JSON.parse() sedang dieksekusi, periksa parameter input yang diteruskan ke fungsi tersebut. Jika parameter input tidak valid atau format JSON salah, itulah yang menjadi penyebab error.

    Berikut adalah contoh kode JavaScript yang menyebabkan error tersebut:

    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 ke fungsi JSON.parse().

    Berikut adalah contoh panggilan API yang menunjukkan cara penerusan permintaan:

    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 untuk diteruskan tetapi karena payload XML diteruskan, payload 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 jika:

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

Misalnya, error jenis ditampilkan:

  • Jika Anda mencoba memanggil fungsi toUpperCase() pada nomor. Ini adalah karena fungsi toUpperCase() hanya dapat dipanggil pada objek string.
  • Jika Anda mencoba membaca properti dari objek null atau objek yang belum ditetapkan.

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 nomor yang Anda dapatkan error tersebut. 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 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, maka itulah penyebab error.

    Berikut 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()( dipanggil pada objek nomor. 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 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 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 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 length properti 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 belum ditentukan. Anda mungkin harus membaca dan memahami {i>file<i} sumber secara lengkap untuk menentukan bagaimana objek tertentu didefinisikan atau diambil dan menentukan mengapa objek tersebut didapati tidak terdefinisi. Jika Anda mendapati bahwa objek tertentu memang tidak ditentukan dan Anda mencoba mengakses panjang properti dari objek tersebut, hal itulah yang menyebabkan error.

    Mari 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 ini 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 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 ini, 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 decodeURI atau decodeURIComponent, maka Anda akan mendapatkan error tersebut.

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, dan nomor baris tempat terjadi kesalahan, dan deskripsi kesalahan. Anda dapat menemukan semua informasi ini di elemen {i> faultstring <i}dari respons {i>error<i}. 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 fungsi URI mana pun berisi karakter yang tidak sah. 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 enkode simbol persentase. Misalnya, %25:

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