Вы просматриваете документацию Apigee Edge .
Перейдите в документацию Apigee X.info
ScriptExecutionFailed
Код ошибки
steps.javascript.ScriptExecutionFailed
Тело ответа об ошибке
{
"fault": {
"faultstring": "Execution of javascript_policy_name failed with error: error_type: error_description. (javascript_source_file_name)\"",
"detail": {
"errorcode": "steps.javascript.ScriptExecutionFailed"
}
}
}
Типы ошибок и возможные причины
Политика JavaScript может вызывать множество различных типов ошибок ScriptExecutionFailed. Некоторые из наиболее часто встречающихся ошибок перечислены в таблице ниже:
| Тип ошибки | Причина |
| Ошибка диапазона | Ошибка RangeError возникает, если вы используете число, выходящее за пределы допустимого диапазона значений. |
| Ошибка ссылки | Ошибка ReferenceError возникает, если вы используете (ссылаетесь) на переменную, которая не была объявлена. |
| Синтаксическая ошибка | В случае попытки выполнения кода с синтаксической ошибкой будет выброшено исключение SyntaxError . |
| Ошибка типа | Ошибка TypeError возникает, если вы используете операцию, выходящую за пределы ожидаемых типов. |
| Ошибка URI | В случае использования недопустимых символов в функции URI будет выброшено исключение URIError . |
Ошибка диапазона
Ошибка типа RangeError возникает, когда вы выполняете операцию над значением или передаете значение в функцию, которое не входит в набор или диапазон допустимых значений.
Например, эта ошибка возникает при следующих обстоятельствах:
- Если вы используете недопустимую дату, например, 31 сентября 2018 года, с некоторыми API для работы с датами.
- Если вы передадите недопустимое значение числовым методам, таким как
Number.toPrecision(),Number.tofixed()илиNumber.toExponential(), например, большое значение, такое как 400 или 500, в методNumber.toPrecision()вы увидите ошибку диапазона. - Если вы создадите массив с недопустимой длиной.
Тело ответа об ошибке
{
"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"
}
}
}
Диагноз
Укажите политику 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)\""Изучите исходный файл JavaScript (указанный на шаге №1 выше) и проверьте, не используется ли недопустимая дата в номере строки, указанном в сообщении об ошибке, или не содержит ли переменная, указанная в номере строки, недопустимую дату. Если используется недопустимая дата, то это и является причиной ошибки.
Вот пример исходного файла JavaScript, который приводит к этой ошибке:
ParseDate.js
var date = new Date('2018-09-31T11:19:08.402Z'); date.toISOString();В этом примере переменная
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"
}
}
}
Диагноз
Определите политику 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)\""Изучите исходный файл JavaScript (указанный на шаге №1 выше). Если большое число, упомянутое в описании ошибки, используется в конкретной строке, то это и есть причина ошибки.
Вот пример исходного файла JavaScript, который приводит к этой ошибке:
SetNumberPrecision.js
var number = 12.3456; var rounded_number = number.toPrecision(400); print("rounded_number = " + rounded_number);В этом примере обратите внимание, что во второй строке используется большое значение 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"
}
}
}
Диагноз
Определите политику 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)\""Проверьте номер строки в исходном файле 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);Проверьте, определена ли конкретная переменная в коде JavaScript. Если переменная не определена, то это и является причиной ошибки.
В приведенном выше примере скрипта используется необъявленная/неопределенная переменная
price; поэтому вы увидите следующую ошибку:"faultstring": "Execution of ComputeTotalPrice failed with error: Javascript runtime error: \"ReferenceError: \"price\" is not defined. (ComputeTotalPrice.js:3)\""
Разрешение
Убедитесь, что все переменные, на которые ссылается код JavaScript, определены корректно.
Чтобы исправить проблему с приведенным выше примером JavaScript, определите переменную price до ее использования. Например:
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 parse, передается недопустимый формат входных данных.
Например, если в качестве входных данных для API JSON.parse , используемого в политике JavaScript, передается недопустимый или некорректно сформированный JSON-файл, то вы получите эту ошибку.
Тело ответа об ошибке
{
"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"
}
}
}
Диагноз
Определите политику JavaScript, её исходный файл, номер строки, в которой произошла ошибка, и описание ошибки. Всю эту информацию можно найти в элементе
faultstringответа об ошибке. Например, в следующемfaultstringимя политики JavaScript —ParseJSONRequest, исходный файл JavaScript —ParseJSONRequest.js, номер строки, в которой произошла ошибка, —2, а описание ошибки —Unexpected token:"faultstring": "Execution of ParseJSONRequest failed with error: Javascript runtime error: \"SyntaxError: Unexpected token: <. (ParseJSONRequest.js:2)\""Изучите строку номер 2 в исходном файле JavaScript (указанную на шаге № 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>'В приведенном выше запросе в API-прокси передается следующий XML-код:
<city>Bangalore</city>. APIJSON.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 возникает в следующих случаях:
- Операнд или аргумент, переданный функции, несовместим с типом, ожидаемым этим оператором или функцией.
- Функция вызывается для объекта, имеющего значение null, undefined или являющегося некорректным.
- Доступ к свойству осуществляется из объекта, имеющего значение null, undefined или являющегося некорректным.
Например, возникает ошибка типа:
- Если вы попытаетесь вызвать функцию
toUpperCase()для числа, это произойдет потому, что функцияtoUpperCase()может быть вызвана только для строковых объектов. - Если вы попытаетесь прочитать свойство из объекта, имеющего значение null или undefined.
Тело ответа об ошибке
{
"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"
}
}
}
Диагноз
Определите политику 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.Изучите исходный файл JavaScript и проверьте, вызывается ли функция
toUpperCase()для объекта, числовое значение которого равно 100, в строке номер 2 (указанной в шаге № 1 выше). Если да, то это и есть причина ошибки.Вот пример исходного файла JavaScript, который приводит к этой ошибке:
ConvertToUpperCase.js
var number = 100; var result = number.toUpperCase();В приведенном выше коде JavaScript переменной
numberприсваивается значение 100. Затем для объекта number вызывается функция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"
}
}
}
Диагноз
Определите политику JavaScript, ее исходный файл, номер строки, где произошла ошибка, и описание ошибки. Всю эту информацию можно найти в элементе
faultstringответа об ошибке. Например, в следующемfaultstringимя политики —ParseJSONResponse, исходный файл —ParseJSONResponse.js, номер строки —6, а описание ошибки —Cannot read property "length" from undefined."faultstring": "Execution of ParseJSONResponse failed with error: Javascript runtime error: \"TypeError: Cannot read property \"length\" from undefined. (ParseJSONResponse.js:6)\""Ошибка указывает на то, что свойство length не может быть считано из неопределенного объекта.
Проверьте номер строки в исходном файле JavaScript (указанный на шаге №1 выше) и убедитесь, имеет ли объект допустимое значение или является неопределенным. Возможно, вам придется прочитать и понять весь исходный файл, чтобы определить, как был определен или получен конкретный объект, и выяснить, почему он оказался неопределенным. Если вы обнаружите, что конкретный объект действительно неопределен, и вы пытаетесь получить доступ к свойству length из него, то это и есть причина ошибки.
Давайте рассмотрим пример, чтобы лучше понять эту проблему:
Предположим, вы получили следующий JSON-ответ от бэкэнд-сервера:
{ "cars": [ { "name":"Toyota", "count": 150 } { "name":"Honda", "count": 100 }, { "name":"Ford", "count": 75 } ] }Вот пример исходного файла 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); }Внимательно изучив код JavaScript, можно увидеть, что во второй строке значение
response.contentсчитывается/сохраняется в переменнуюjsonDataкак обычная строка (в кавычках).Поскольку
jsonDataпредставляет собой обычную строку, при попытке доступа кcarsизjsonData(jsonData.cars) значение будет неопределенным.Впоследствии, при попытке прочитать свойство
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 используются недопустимые символы. Например, если в функции decodeURI или decodeURIComponent передать URI, содержащий символ процента, вы получите эту ошибку.
Тело ответа об ошибке
{
"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"
}
}
}
Диагноз
Укажите политику JavaScript, её исходный файл, номер строки, где произошла ошибка, и описание ошибки. Всю эту информацию можно найти в элементе faultstring ответа об ошибке. Например, в следующем примере faultstring имя политики JavaScript —
URIDecode</code, исходный файл JavaScript —URIDecode.js, номер строки —2, а описание ошибки —Malformed URI sequence:"faultstring": "Execution of URIDecode failed with error: Javascript runtime error: \"URIError: Malformed URI sequence. (URIDecode.js:2)\""В описании ошибки указано, что во второй строке файла
URIDecode.jsиспользуется некорректная последовательность URI.Изучите исходный файл 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);