Вы просматриваете документацию 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
выдается, когда вы оперируете значением или передаете значение функции, которое не входит в набор или диапазон допустимых значений.
Например, эта ошибка возникает при следующих обстоятельствах:
- Если вы используете недопустимую дату, например 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();
В этом примере в строке номер 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"
}
}
}
Диагностика
Укажите политику 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);
Обратите внимание, что в этом примере в строке номер 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"
}
}
}
Диагностика
Определите политику 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, показанным выше, определите переменную цену перед ее использованием. Например:
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"
}
}
}
Диагностика
Укажите политику 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>'
В приведенном выше запросе следующая полезная нагрузка XML передается прокси-серверу API
<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
выдается, когда:
- Операнд или аргумент, передаваемый функции, несовместим с типом, ожидаемым этим оператором или функцией.
- Функция вызывается для нулевого, неопределенного или неправильного объекта.
- Доступ к свойству осуществляется из нулевого, неопределенного или неправильного объекта.
Например, выдается ошибка типа:
- Если вы попытаетесь вызвать функцию
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"
}
}
}
Диагностика
Укажите политику 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. Впоследствии функция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)\""
Ошибка указывает на то, что длину свойства невозможно прочитать из неопределенного объекта.
Проверьте номер строки в исходном файле JavaScript (указанный на шаге 1 выше) и проверьте, имеет ли объект допустимое значение или он не определен. Возможно, вам придется прочитать и понять весь исходный файл, чтобы определить, как конкретный объект был определен или получен, и определить, почему объект оказался неопределенным. Если вы обнаружите, что конкретный объект действительно не определен, и вы пытаетесь получить доступ к его длине свойства, то это и есть причина ошибки.
Давайте рассмотрим пример, чтобы лучше понять эту проблему:
Предположим, вы получили следующий ответ 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, вы можете увидеть, что в строке номер 2 файл
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. Например, если вы передадите 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"
}
}
}
Диагностика
Определите политику 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.Изучите исходный файл 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);