현재 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" } } }
오류 유형 및 가능한 원인
자바스크립트 정책으로 인해 다양한 유형의 ScriptExecutionFailed 오류가 발생할 수 있습니다. 가장 흔하게 발생하는 오류 중 일부가 아래 표에 나와 있습니다.
오류 유형 | 원인 |
범위 오류 | 합법적인 값의 범위를 벗어나는 숫자를 사용하는 경우 RangeError가 발생합니다. |
참조 오류 | 선언되지 않은 변수를 사용(참조)하는 경우 ReferenceError가 발생합니다. |
구문 오류 | 구문 오류가 있는 코드를 평가하려고 하면 SyntaxError가 발생합니다. |
유형 오류 | 예상 유형 범위를 벗어나는 작업을 사용하면 TypeError가 발생합니다. |
URI 오류 | URI 함수에 잘못된 문자를 사용하면 URIError가 발생합니다. |
범위 오류
오류 유형 RangeError
는 값에 대해 작업을 수행하거나 허용된 값의 집합 또는 범위에 속하지 않는 함수에 값을 전달하면 발생합니다.
예를 들어 다음과 같은 상황에서 이 오류가 발생합니다.
- 일부 날짜 API에서 2018년 9월 31일과 같이 잘못된 날짜를 사용하는 경우
Number.toPrecision()
,Number.tofixed()
,Number.toExponential()
과 같은 숫자 메서드에 잘못된 값을 전달하는 경우 예를 들어Number.toPrecision()
메서드에 400 또는 500과 같은 큰 값을 전달하면 범위 오류가 표시됩니다.- 잘못된 길이의 배열을 만드는 경우
오류 응답 본문
{ "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" } } }
참고: 범위 오류의 진단 및 해결 방법은 자바스크립트 정책에서 발생하는 정확한 오류 메시지에 따라 다릅니다. 아래에 설명된 몇 가지 예를 참조하세요.
예시 1: 잘못된 날짜
오류 응답 본문 예시
{
"fault": {
"faultstring": "Execution of ParseDate failed with error: Javascript runtime error: \"RangeError: Date is invalid. (ParseDate.js:2)\"",
"detail": {
"errorcode": "steps.javascript.ScriptExecutionFailed"
}
}
}
진단
자바스크립트 정책, 소스 파일, 오류가 발생한 라인 번호 및 오류 설명을 식별합니다. 이 정보는 오류 응답의
faultstring
요소에서 모두 확인할 수 있습니다. 예를 들어 다음faultstring
에서 자바스크립트 정책 이름은ParseDate
, 자바스크립트 소스 파일은ParseDate.js
, 오류가 발생한 라인 번호는2
, 오류 설명은Date is invalid
입니다."faultstring": "Execution of ParseDate failed with error: Javascript runtime error: \"RangeError: Date is invalid. (ParseDate.js:2)\""
자바스크립트 소스 파일(위의 1단계에서 확인됨)을 검토하여 오류에 지정된 라인 번호에 잘못된 날짜가 있는지 또는 라인 번호에 사용된 변수에 잘못된 날짜가 있는지 확인합니다. 잘못된 날짜를 사용하면 이는 오류의 원인이 됩니다.
다음은 이 오류를 발생시키는 자바스크립트 소스 파일 샘플입니다.
ParseDate.js
var date = new Date('2018-09-31T11:19:08.402Z'); date.toISOString();
이 예시에서는 라인 번호 2에 사용된
date
변수가 있습니다. 소스 파일을 검사하면date
변수가 잘못된 날짜로 설정되었음을 확인할 수 있습니다:2018-09-31T11:19:08.402Z.
. 9월은 31일이 없으므로 잘못된 날짜입니다.참고: 이 예시에서 사용된 ISO-8601 형식은
YYYY-MM-DDTHH:mm:ss.sssZ
입니다.
해결 방법
자바스크립트 코드에서 날짜 API를 사용하는 동안에는 항상 유효한 날짜를 사용해야 합니다.
위에 표시된 예시 자바스크립트 코드를 수정하려면 아래와 같이 날짜를 Sept 30 2018
로 설정합니다.
var date = new Date('2018-09-30T11:19:08.402Z');
date.toISOString();
예시 2: 정밀도 API에 잘못된 숫자가 전달됨
오류 응답 본문 예시
{
"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"
}
}
}
진단
자바스크립트 정책, 소스 파일, 오류가 발생한 라인 번호 및 오류 설명을 식별합니다. 이 정보는 오류 응답의
faultstring
요소에서 모두 확인할 수 있습니다. 예를 들어 다음faultstring
에서 자바스크립트 정책 이름은SetNumberPrecision
, 자바스크립트 소스 파일은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)\""
자바스크립트 소스 파일을 검토합니다(위의 1단계에서 확인). 오류 설명의 일부로 언급된 큰 숫자가 특정 라인 번호에 사용된 경우 오류의 원인이 됩니다.
다음은 이 오류를 발생시키는 자바스크립트 소스 파일 샘플입니다.
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()
메서드에 사용된 숫자가 허용되는 값의 집합 내에 있는지 확인합니다.
위에 설명된 자바스크립트 관련 문제를 해결하려면 유효한 유효 자릿수를 2로 설정합니다.
var number = 12.3456;
var rounded_number = number.toPrecision(2);
print("rounded_number = " + rounded_number);
참조 오류
오류 유형 ReferenceError
는 자바스크립트의 정의되지 않은 변수가 사용(참조)되거나 관련 작업을 실행할 때 발생합니다.
오류 응답 본문
{ "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"
}
}
}
진단
자바스크립트 정책, 소스 파일, 정의되지 않은 변수가 참조되는 라인 번호를 식별합니다. 이 정보는 오류 응답의
faultstring
요소에서 모두 확인할 수 있습니다. 예를 들어 다음faultstring
에서 자바스크립트 정책 이름은ComputeTotalPrice
, 대응하는 소스 파일은ComputeTotalPrice.js
, 오류가 발생한 라인 번호는3
, 정의되지 않은 변수 이름은price.
입니다."faultstring": "Execution of ComputeTotalPrice failed with error: Javascript runtime error: \"ReferenceError: \"price\" is not defined. (ComputeTotalPrice.js:3)\""
자바스크립트 소스 파일의 라인 번호를 검토하고, 위의 1단계에서 식별된 정의되지 않은 변수가 참조되는지 확인합니다. 예를 들어 다음 자바스크립트 코드는 라인 3의 정의되지 않은 변수
price
를 참조하며, 이 변수는 Falsestring과 일치합니다.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);
특정 변수가 자바스크립트 코드 내에 정의되어 있는지 확인합니다. 변수가 정의되지 않은 경우 이는 오류의 원인이 됩니다.
위에 표시된 예시 스크립트에서는 선언되지 않은/정의된
price
변수가 사용됩니다. 따라서 다음과 같은 오류가 표시됩니다."faultstring": "Execution of ComputeTotalPrice failed with error: Javascript runtime error: \"ReferenceError: \"price\" is not defined. (ComputeTotalPrice.js:3)\""
해결 방법
자바스크립트 코드에서 참조된 모든 변수가 올바르게 정의되었는지 확인합니다.
위에 표시된 자바스크립트 예시와 관련된 문제를 해결하려면 사용 전에 변수 가격을 정의하세요. 예를 들면 다음과 같습니다.
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
는 자바스크립트 엔진이 언어 구문을 준수하지 않는 토큰 또는 토큰 주문을 발견하거나 JSON/XML 파싱과 같은 잘못된 형식 입력을 파서 API로 전달할 때 발생합니다.
예를 들어 유효하지 않거나 형식이 잘못된 JSON 페이로드가 자바스크립트 정책 내에서 사용되는 JSON.parse
API의 입력으로 전달되는 경우 이 오류가 발생합니다.
오류 응답 본문
{ "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"
}
}
}
진단
자바스크립트 정책, 소스 파일, 오류가 발생한 라인 번호 및 오류 설명을 식별합니다. 이 정보는 오류 응답의
faultstring
요소에서 모두 확인할 수 있습니다. 예를 들어 다음faultstring
에서 자바스크립트 정책 이름은ParseJSONRequest
, 자바스크립트 소스 파일은ParseJSONRequest.js
, 오류가 발생한 라인 번호는2
, 오류 설명은Unexpected token
입니다."faultstring": "Execution of ParseJSONRequest failed with error: Javascript runtime error: \"SyntaxError: Unexpected token: <. (ParseJSONRequest.js:2)\""
자바스크립트 소스 파일(위의 1단계에서 확인)에서 라인 번호 2를 검토하고 수행 중인 작업을 확인합니다.
JSON.parse()
함수가 실행 중인 경우 전달된 입력 매개변수를 확인합니다. 입력 매개변수가 유효하지 않거나 잘못된 형식의 JSON인 경우 이는 오류의 원인이 됩니다.다음은 이 오류를 발생시키는 자바스크립트 코드 샘플입니다.
var input = context.getVariable("request.content"); var result = JSON.parse(input);
이 예시에서는 API 프록시에 전달된 요청 페이로드(
request.content
)가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>
로 전달됩니다.JSON.parse
API는 유효한 JSON을 전달해야 하지만 XML 페이로드가 대신 전달되므로 다음 오류와 함께 실패합니다."Execution of ParseJSONRequest failed with error: Javascript runtime error: \"SyntaxError: Unexpected token: <. (ParseJSONRequest.js:2)\""
해결 방법
자바스크립트 코드에 사용된 파싱 API에 유효한 입력을 전달해야 합니다.
위에 설명된 샘플 정책의 문제를 해결하려면 다음과 같이 유효한 JSON 페이로드 요청을 전달합니다.
curl -v "http://<org>-<env>.apigee.net/v1/js-demo" -H "Content-Type: application/json" -X POST -d '{"city" : "Bangalore"}'
유형 오류
다음과 같은 경우 오류 유형 TypeError
가 발생합니다.
- 함수에 전달된 피연산자 또는 인수가 해당 연산자 또는 함수에서 예상하는 유형과 호환되지 않습니다.
- 함수는 null이거나 정의되지 않았거나 잘못된 객체에서 호출됩니다.
- 속성은 null이거나 정의되지 않았거나 잘못된 객체에서 액세스합니다.
예를 들어 다음과 같은 유형 오류가 발생합니다.
- 숫자에서
toUpperCase()
함수를 호출하려는 경우toUpperCase()
함수는 문자열 객체에서만 호출할 수 있기 때문입니다. - null 또는 정의되지 않은 객체에서 속성을 읽으려는 경우
오류 응답 본문
{ "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"
}
}
}
진단
자바스크립트 정책, 소스 파일, 오류가 발생한 라인 번호 및 오류 설명을 식별합니다. 이 정보는 오류 응답의
faultstring
요소에서 모두 확인할 수 있습니다. 예를 들어 다음faultstring
에서 자바스크립트 정책 이름은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)\""
오류 설명은 숫자 값이 100인 객체에서
toUpperCase()
함수를 호출하고 있음을 나타냅니다.자바스크립트 소스 파일을 검토하면서 라인 번호 2에서 숫자 값이 100(위의 1단계 참조)인 객체에서
toUpperCase()
함수를 호출하는지 확인합니다. 그렇다면 이는 오류의 원인이 됩니다.다음은 이 오류를 발생시키는 자바스크립트 소스 파일 샘플입니다.
ConvertToUpperCase.js
var number = 100; var result = number.toUpperCase();
위에 표시된 자바스크립트 코드에서 변수
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"
}
}
}
진단
자바스크립트 정책, 소스 파일, 오류가 발생한 라인 번호 및 오류 설명을 식별합니다. 이 정보는 오류 응답의
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 속성을 정의되지 않은 객체에서 읽을 수 없음을 나타냅니다.
위의 1단계에서 식별된 자바스크립트 소스 파일의 라인 번호를 검토하여 객체에 유효한 값이 있는지 또는 정의되지 않은 상태인지 확인합니다. 특정 객체가 정의되거나 파생되는 방식을 확인하고 객체가 정의되지 않은 것으로 확인된 이유를 확인하려면 전체 소스 파일을 읽고 이해해야 할 수 있습니다. 특정 객체가 정의되지 않았고 이 객체에서 속성 길이에 액세스하려고 시도하는 경우 이는 오류의 원인이 됩니다.
이 문제를 더 잘 이해하려면 다음 예를 살펴보세요.
백엔드 서버에서 다음과 같은 JSON 응답을 받았다고 가정해보세요.
{ "cars": [ { "name":"Toyota", "count": 150 } { "name":"Honda", "count": 100 }, { "name":"Ford", "count": 75 } ] }
다음은 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); }
자바스크립트 코드를 신중하게 검토하면 라인 번호 2에서
response.content
가 변수jsonData
를 일반 문자열(따옴표)로 읽거나 저장할 수 있습니다.jsonData
는 일반 문자열이므로jsonData
(jsonData.cars
)에서cars
에 액세스하려고 할 때 정의되지 않습니다.이후에 정의되지 않은
jsonData.cars
의 속성length
를 읽으려고 시도하면 다음과 같은 오류가 발생합니다."faultstring": "Execution of ParseJSONResponse failed with error: Javascript runtime error: \"TypeError: Cannot read property \"length\" from undefined. (ParseJSONResponse.js:6)\""
해결 방법
관련 JSON API를 사용하여 JSON 데이터를 항상 JSON 객체로 읽어야 합니다.
위에서 설명한 자바스크립트 예시를 수정하려면 response.content
객체에서 JSON.parse()
함수를 사용하여 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"
}
}
}
진단
자바스크립트 정책, 소스 파일, 오류가 발생한 라인 번호 및 오류 설명을 식별합니다. 이 모든 정보는 오류 응답의 Falsestring 요소에서 확인할 수 있습니다. 예를 들어 다음 faultstring에서 자바스크립트 정책 이름은
URIDecode</code
, 자바스크립트 소스 파일은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
의 라인 번호 2에서 잘못된 유형의 URI 시퀀스가 사용되었음을 나타냅니다.자바스크립트 소스 파일을 검토하여 URI 함수에 전달된 인수에 잘못된 문자가 포함되어 있는지 확인합니다. 그렇다면 이는 오류의 원인이 됩니다.
다음은 이 오류를 발생시키는 자바스크립트 소스 파일의 예입니다.
URIDecode.js
var str = "75%-Completed"; var decoded_str = decodeURIComponent(str); context.setVariable("decoded_str", decoded_str);
위에 표시된 자바스크립트 코드 예시에서
decodeURIComponent()
에 전달되는 변수str
에 잘못된 문자로 간주되는 비율 기호가 포함되어 있으므로 다음과 같은 오류가 발생합니다."Execution of URIDecode failed with error: Javascript runtime error: \"URIError: Malformed URI sequence. (URIDecode.js:2)\""
해결 방법
URI 함수에 사용된 모든 문자가 합법적이고 허용되는지 확인합니다.
위에 설명된 자바스크립트 예시 문제를 해결하려면 비율 기호를 인코딩을 사용합니다. 예를 들면 %25
와 같습니다.
var str = "75%25-Completed";
var decoded_str = decodeURIComponent(str);
context.setVariable("decoded_str", decoded_str);