자바스크립트 정책 런타임 오류 문제 해결

현재 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는 값에 대해 작업을 수행하거나 허용된 값의 집합 또는 범위에 속하지 않는 함수에 값을 전달하면 발생합니다.

예를 들어 다음과 같은 상황에서 이 오류가 발생합니다.

  1. 일부 날짜 API에서 2018년 9월 31일과 같이 잘못된 날짜를 사용하는 경우
  2. Number.toPrecision(), Number.tofixed(), Number.toExponential()과 같은 숫자 메서드에 잘못된 값을 전달하는 경우 예를 들어 Number.toPrecision() 메서드에 400 또는 500과 같은 큰 값을 전달하면 범위 오류가 표시됩니다.
  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"
        }
    }
}

참고: 범위 오류의 진단 및 해결 방법은 자바스크립트 정책에서 발생하는 정확한 오류 메시지에 따라 다릅니다. 아래에 설명된 몇 가지 예를 참조하세요.

예시 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. 자바스크립트 정책, 소스 파일, 오류가 발생한 라인 번호 및 오류 설명을 식별합니다. 이 정보는 오류 응답의 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)\""
    
  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"
        }
    }
}

진단

  1. 자바스크립트 정책, 소스 파일, 오류가 발생한 라인 번호 및 오류 설명을 식별합니다. 이 정보는 오류 응답의 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)\""
    
  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"
        }
    }
}

진단

  1. 자바스크립트 정책, 소스 파일, 정의되지 않은 변수가 참조되는 라인 번호를 식별합니다. 이 정보는 오류 응답의 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)\""
    
  2. 자바스크립트 소스 파일의 라인 번호를 검토하고, 위의 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);
    
    
  3. 특정 변수가 자바스크립트 코드 내에 정의되어 있는지 확인합니다. 변수가 정의되지 않은 경우 이는 오류의 원인이 됩니다.

    위에 표시된 예시 스크립트에서는 선언되지 않은/정의된 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"
        }
    }
}

진단

  1. 자바스크립트 정책, 소스 파일, 오류가 발생한 라인 번호 및 오류 설명을 식별합니다. 이 정보는 오류 응답의 faultstring 요소에서 모두 확인할 수 있습니다. 예를 들어 다음 faultstring에서 자바스크립트 정책 이름은 ParseJSONRequest, 자바스크립트 소스 파일은 ParseJSONRequest.js, 오류가 발생한 라인 번호는 2, 오류 설명은 Unexpected token입니다.

    "faultstring": "Execution of ParseJSONRequest failed with error: Javascript runtime error: \"SyntaxError: Unexpected token: <. (ParseJSONRequest.js:2)\""
    
  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"
        }
    }
}

진단

  1. 자바스크립트 정책, 소스 파일, 오류가 발생한 라인 번호 및 오류 설명을 식별합니다. 이 정보는 오류 응답의 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. 자바스크립트 소스 파일을 검토하면서 라인 번호 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"
        }
    }
}

진단

  1. 자바스크립트 정책, 소스 파일, 오류가 발생한 라인 번호 및 오류 설명을 식별합니다. 이 정보는 오류 응답의 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 속성을 정의되지 않은 객체에서 읽을 수 없음을 나타냅니다.

  2. 위의 1단계에서 식별된 자바스크립트 소스 파일의 라인 번호를 검토하여 객체에 유효한 값이 있는지 또는 정의되지 않은 상태인지 확인합니다. 특정 객체가 정의되거나 파생되는 방식을 확인하고 객체가 정의되지 않은 것으로 확인된 이유를 확인하려면 전체 소스 파일을 읽고 이해해야 할 수 있습니다. 특정 객체가 정의되지 않았고 이 객체에서 속성 길이에 액세스하려고 시도하는 경우 이는 오류의 원인이 됩니다.

    이 문제를 더 잘 이해하려면 다음 예를 살펴보세요.

    1. 백엔드 서버에서 다음과 같은 JSON 응답을 받았다고 가정해보세요.

      {
          "cars": [
             { "name":"Toyota", "count": 150 }
             { "name":"Honda", "count": 100 },
             { "name":"Ford", "count": 75 }
          ]
      }
      
    2. 다음은 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. 자바스크립트 코드를 신중하게 검토하면 라인 번호 2에서 response.content가 변수 jsonData를 일반 문자열(따옴표)로 읽거나 저장할 수 있습니다.

    4. jsonData는 일반 문자열이므로 jsonData(jsonData.cars)에서 cars에 액세스하려고 할 때 정의되지 않습니다.

    5. 이후에 정의되지 않은 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"
        }
    }
}

진단

  1. 자바스크립트 정책, 소스 파일, 오류가 발생한 라인 번호 및 오류 설명을 식별합니다. 이 모든 정보는 오류 응답의 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 시퀀스가 사용되었음을 나타냅니다.

  2. 자바스크립트 소스 파일을 검토하여 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);