Устранение ошибок во время выполнения политики 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 Ошибка URIError выдается, если вы используете недопустимые символы в функции URI.

Ошибка диапазона

Тип ошибки RangeError выдается, когда вы оперируете значением или передаете значение функции, которое не входит в набор или диапазон допустимых значений.

Например, эта ошибка возникает при следующих обстоятельствах:

  1. Если вы используете недопустимую дату, например 31 сентября 2018 года, с некоторыми API-интерфейсами дат.
  2. Если вы передаете недопустимое значение числовым методам, таким как Number.toPrecision() , Number.tofixed() или Number.toExponential() . Например, предположим, что вы передаете большое значение, например 400 или 500, в метод Number.toPrecision() и вы увидите ошибку диапазона.
  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. Эта дата недействительна, поскольку в сентябре нет 31 дня.

    Примечание. В этом примере используется формат ISO-8601: YYYY-MM-DDTHH:mm:ss.sssZ

Разрешение

Убедитесь, что вы всегда используете допустимую дату при использовании API дат в коде JavaScript.

Чтобы исправить пример кода JavaScript, показанный выше, вы можете установить дату Sept 30 2018 как показано ниже:

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

Пример 2. Недопустимый номер передан в API Precision.

Пример тела ответа об ошибке

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

Ошибка ссылки

Тип ошибки ReferenceError выдается, когда неопределенная переменная в вашем JavaScript используется (ссылается) или обрабатывается.

Тело ответа об ошибке

{
    "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 ссылается на неопределенную переменную price в строке 3, которая соответствует значению в строке ошибки:

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

Синтаксическая ошибка

Тип ошибки SyntaxError выдается, когда механизм JavaScript обнаруживает токены или порядок токенов, который не соответствует синтаксису языка, или когда входные данные недопустимого формата передаются API-интерфейсам синтаксического анализатора, таким как анализ JSON/XML.

Например, если недопустимая или неправильно сформированная полезная нагрузка JSON передается в качестве входных данных в API JSON.parse , используемый в политике JavaScript, вы получаете эту ошибку.

Тело ответа об ошибке

{
    "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. Изучите строку номер 2 в исходном файле JavaScript (указанную на шаге 1 выше) и проверьте, какая операция выполняется. Если выполняется функция JSON.parse() , проверьте переданный ей входной параметр. Если входной параметр недействителен или имеет неверный формат JSON, это и есть причина ошибки.

    Вот пример кода JavaScript, который приводит к этой ошибке:

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

    В этом примере полезные данные запроса ( request.content ), передаваемые прокси API, используются в качестве входных данных для функции 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 <city>Bangalore</city> . API JSON.parse ожидает передачи допустимого JSON, но поскольку вместо этого передается полезная нагрузка XML, происходит сбой с ошибкой ниже:

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

Разрешение

Обязательно передайте действительные входные данные API-интерфейсам синтаксического анализа, используемым в коде JavaScript.

Чтобы устранить проблему с примером политики, описанной выше, передайте действительный запрос полезных данных 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)\""
    

    В описании ошибки указано, что вы вызываете функцию toUpperCase() для объекта, числовое значение которого равно 100.

  2. Изучите исходный файл JavaScript и проверьте, вызываете ли вы функцию toUpperCase() для объекта, числовое значение которого равно 100 в строке номер 2 (определено на шаге № 1 выше). Если да, то это причина ошибки.

    Вот пример исходного файла 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)\""
    

    Ошибка указывает на то, что длину свойства невозможно прочитать из неопределенного объекта.

  2. Проверьте номер строки в исходном файле JavaScript (указанный на шаге 1 выше) и проверьте, имеет ли объект допустимое значение или он не определен. Возможно, вам придется прочитать и понять весь исходный файл, чтобы определить, как конкретный объект был определен или получен, и определить, почему объект оказался неопределенным. Если вы обнаружите, что конкретный объект действительно не определен, и вы пытаетесь получить доступ к его длине свойства, то это и есть причина ошибки.

    Давайте рассмотрим пример, чтобы лучше понять эту проблему:

    1. Предположим, вы получили следующий ответ JSON от внутреннего сервера:

      {
          "cars": [
             { "name":"Toyota", "count": 150 }
             { "name":"Honda", "count": 100 },
             { "name":"Ford", "count": 75 }
          ]
      }
      
    2. Вот пример исходного файла JavaScript, который анализирует этот ответ JSON и приводит к упомянутой выше ошибке:

      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 — это обычная строка, при попытке доступа к cars из jsonData ( jsonData.cars ) значение будет неопределенным.

    5. Впоследствии, когда вы попытаетесь прочитать length свойства из jsonData.cars , которая не определена, вы получите ошибку:

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

Разрешение

Убедитесь, что вы всегда читаете данные JSON как объект JSON, используя соответствующие API JSON.

Чтобы исправить описанный выше пример JavaScript, вы можете использовать функцию JSON.parse() для объекта response.content , чтобы получить его как объект 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

Ошибка типа URIError выдается, если вы используете недопустимые символы в функции URI. Например, если вы передадите URI с символом процента в функции decodeURI или decodeURIComponent , вы получите эту ошибку.

Тело ответа об ошибке

{
    "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, ее исходный файл, номер строки, в которой произошла ошибка, и описание ошибки. Всю эту информацию можно найти в элементе errorstring ответа об ошибке. Например, в следующей строке ошибки имя политики 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)\""
    

    В описании ошибки указано, что в строке номер 2 URIDecode.js используется неверная последовательность URI.

  2. Изучите исходный файл JavaScript и проверьте, содержит ли аргумент, переданный какой-либо из функций URI, какие-либо недопустимые символы. Если да, то это причина ошибки.

    Вот пример исходного файла JavaScript, который приводит к этой ошибке:

    URIDecode.js

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

    В примере кода JavaScript, показанном выше, переменная str , передаваемая в decodeURIComponent() содержит символ процента, который считается недопустимым символом; поэтому вы получаете ошибку:

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