Risoluzione dei problemi relativi agli errori di runtime dei criteri JavaScript

Stai visualizzando la documentazione di Apigee e Apigee hybrid.
Visualizza la documentazione di Apigee Edge.

ScriptExecutionFailed

Codice di errore

steps.javascript.ScriptExecutionFailed

Corpo della risposta di errore

{
    "fault": {
        "faultstring": "Execution of javascript_policy_name failed with error: error_type: error_description. (javascript_source_file_name)\"",
        "detail": {
            "errorcode": "steps.javascript.ScriptExecutionFailed"
        }
    }
}

Tipi di errori e possibili cause

Il criterio JavaScript può generare molti tipi diversi di errori ScriptExecutionFailed. Alcuni degli errori più comuni sono elencati nella tabella seguente:

Tipo di errore Causa
Errore di intervallo Viene generato un errore RangeError se utilizzi un numero esterno all'intervallo di valori consentiti.
Errore di riferimento Viene generato un errore ReferenceError se utilizzi (fai riferimento a) una variabile che non è stata dichiarata.
Errore di sintassi Viene generato un SyntaxError se provi a valutare il codice con un errore di sintassi.
Errore di tipo Viene generato un TypeError se utilizzi un'operazione non compresa nell'intervallo di tipi previsti.
Errore URI Viene generato un errore URIError se utilizzi caratteri non validi in una funzione URI.

Errore di intervallo

Il tipo di errore RangeError viene generato quando operi su un valore o ne passi uno a una funzione che non è nell'insieme o nell'intervallo di valori consentiti.

Ad esempio, questo errore viene generato nelle seguenti circostanze:

  1. Se utilizzi una data non valida come 31 settembre 2018 con alcune API Date.
  2. Se passi un valore non valido a metodi numerici come Number.toPrecision(), Number.tofixed() o Number.toExponential(). Ad esempio, supponiamo che tu passi un valore elevato come 400 o 500 al metodo Number.toPrecision(). Verrà visualizzato un errore di intervallo.
  3. Se crei un array con una lunghezza non valida.

Corpo della risposta di errore

{
    "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"
        }
    }
}

Nota:la diagnosi e la risoluzione degli errori di intervallo dipendono dal messaggio di errore esatto generato dal criterio JavaScript. Di seguito sono riportati un paio di esempi per riferimento futuro.

Esempio 1: data non valida

Esempio di testo della risposta di errore

{
    "fault": {
        "faultstring": "Execution of ParseDate failed with error: Javascript runtime error: \"RangeError: Date is invalid. (ParseDate.js:2)\"",
        "detail": {
            "errorcode": "steps.javascript.ScriptExecutionFailed"
        }
    }
}

Diagnosi

  1. Identifica il criterio JavaScript, il relativo file di origine, il numero di riga in cui si è verificato l'errore e la descrizione dell'errore. Puoi trovare tutte queste informazioni nell'elemento faultstring della risposta all'errore. Ad esempio, nel seguente faultstring, il nome della norma JavaScript è ParseDate, il file di origine JavaScript è ParseDate.js, il numero di riga in cui si è verificato l'errore è 2 e la descrizione dell'errore è Date is invalid:

    "faultstring": "Execution of ParseDate failed with error: Javascript runtime error: \"RangeError: Date is invalid. (ParseDate.js:2)\""
    
  2. Esamina il file sorgente JavaScript (identificato nel passaggio 1 sopra) e controlla se nel numero di riga specificato nell'errore è utilizzata una data non valida o se la variabile utilizzata nel numero di riga ha una data non valida. Se viene utilizzata una data non valida, è questa la causa dell'errore.

    Di seguito è riportato un file di origine JavaScript di esempio che genera questo errore:

    ParseDate.js

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

    In questo esempio, nella riga 2 viene utilizzata una variabile date. Esaminando il file di origine, puoi vedere che la variabile date è impostata con una data non valida: 2018-09-31T11:19:08.402Z. Questa data non è valida perché settembre non ha 31 giorni.

    Nota: il formato ISO-8601 utilizzato in questo esempio è: YYYY-MM-DDTHH:mm:ss.sssZ

Risoluzione

Assicurati di utilizzare sempre una data valida quando utilizzi le API Date nel codice JavaScript.

Per correggere il codice JavaScript di esempio mostrato sopra, puoi impostare la data su Sept 30 2018 come mostrato di seguito:

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

Esempio 2: numero non valido passato alle API Precision

Esempio di testo della risposta di errore

{
    "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"
        }
    }
}

Diagnosi

  1. Identifica il criterio JavaScript, il relativo file di origine, il numero di riga in cui si è verificato l'errore e la descrizione dell'errore. Puoi trovare tutte queste informazioni nell'elemento faultstring della risposta all'errore. Ad esempio, nel seguente faultstring, il nome della norma JavaScript è SetNumberPrecision, il file sorgente JavaScript è SetNumberPrecision.js, il numero di riga in cui si è verificato l'errore è 2 e la descrizione dell'errore è 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. Esamina il file di origine JavaScript (identificato nel passaggio 1 qui sopra). Se il numero grande menzionato nella descrizione dell'errore viene utilizzato nel numero di riga specifico, è la causa dell'errore.

    Di seguito è riportato un file di origine JavaScript di esempio che genera questo errore:

    SetNumberPrecision.js

    var number = 12.3456;
    var rounded_number = number.toPrecision(400);
    print("rounded_number = " + rounded_number);
    

    In questo esempio, tieni presente che nella riga 2 viene utilizzato un valore elevato di 400. Poiché non puoi impostare la precisione su un numero così elevato di cifre, viene visualizzato il seguente errore:

    "faultstring": "Execution of SetNumberPrecision failed with error: Javascript runtime error: "RangeError: Precision 400 out of range. (SetNumberPrecision.js:2)\""
    

Risoluzione

Assicurati che il numero utilizzato nel metodo toPrecision() rientri nell'insieme di valori consentiti.

Per risolvere il problema con l'esempio di codice JavaScript descritto sopra, imposta il numero di cifre significative su 2, che è valido:

var number = 12.3456;
var rounded_number = number.toPrecision(2);
print("rounded_number = " + rounded_number);

Errore di riferimento

Il tipo di errore ReferenceError viene generato quando viene utilizzata (viene fatto riferimento a) o viene eseguita un'operazione su una variabile non definita in JavaScript.

Corpo della risposta di errore

{
    "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"
        }
    }
}

Esempio di testo della risposta di errore

{
    "fault": {
        "faultstring": "Execution of ComputeTotalPrice failed with error: Javascript runtime error: \"ReferenceError: \"price\" is not defined. (ComputeTotalPrice.js:3)\"",
        "detail": {
            "errorcode": "steps.javascript.ScriptExecutionFailed"
        }
    }
}

Diagnosi

  1. Identifica il criterio JavaScript, il relativo file di origine e il numero di riga a cui fa riferimento la variabile non definita. Puoi trovare tutte queste informazioni nell'elemento faultstring della risposta all'errore. Ad esempio, nel seguente faultstring, il nome del criterio JavaScript è ComputeTotalPrice, il file di origine corrispondente è ComputeTotalPrice.js, il numero di riga in cui si è verificato l'errore è 3 e il nome della variabile non definita è price.

    "faultstring": "Execution of ComputeTotalPrice failed with error: Javascript runtime error: \"ReferenceError: \"price\" is not defined. (ComputeTotalPrice.js:3)\""
    
  2. Esamina il numero di riga nel file di origine JavaScript e verifica se viene fatto riferimento alla variabile non definita identificata nel passaggio 1 qui sopra. Ad esempio, il seguente codice JavaScript fa riferimento alla variabile non definita price nella riga 3, che corrisponde a quanto indicato in faultstring:

    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. Controlla se la variabile specifica è definita all'interno del codice JavaScript. Se la variabile non è definita, è la causa dell'errore.

    Nello script di esempio mostrato sopra viene utilizzata la variabile price non dichiarata/definita; pertanto, viene visualizzato l'errore riportato di seguito:

    "faultstring": "Execution of ComputeTotalPrice failed with error: Javascript runtime error: \"ReferenceError: \"price\" is not defined. (ComputeTotalPrice.js:3)\""
    

Risoluzione

Assicurati che tutte le variabili a cui viene fatto riferimento nel codice JavaScript siano definite correttamente.

Per risolvere il problema con l'esempio di codice JavaScript mostrato sopra, definisci il prezzo variabile prima di utilizzarlo. Ad esempio:

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

Errore di sintassi

Il tipo di errore SyntaxError viene generato quando il motore JavaScript rileva token o un ordine di token non conforme alla sintassi del linguaggio oppure quando un input di formato non valido viene passato alle API di analisi sintattica come l'analisi JSON/XML.

Ad esempio, se il payload JSON non valido o con formato non corretto viene passato come input all'API JSON.parse utilizzata all'interno del criterio JavaScript, viene visualizzato questo errore.

Corpo della risposta di errore

{
    "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"
        }
    }
}

Esempio di testo della risposta di errore

{
    "fault": {
        "faultstring": "Execution of ParseJSONRequest failed with error: Javascript runtime error: \"SyntaxError: Unexpected token: <. (ParseJSONRequest.js:2)\"",
        "detail": {
            "errorcode": "steps.javascript.ScriptExecutionFailed"
        }
    }
}

Diagnosi

  1. Identifica il criterio JavaScript, il relativo file di origine, il numero di riga in cui si è verificato l'errore e la descrizione dell'errore. Puoi trovare tutte queste informazioni nell'elemento faultstring della risposta all'errore. Ad esempio, nel seguente faultstring, il nome della norma JavaScript è ParseJSONRequest, il file di origine JavaScript è ParseJSONRequest.js, il numero di riga in cui si è verificato l'errore è 2 e la descrizione dell'errore è Unexpected token:

    "faultstring": "Execution of ParseJSONRequest failed with error: Javascript runtime error: \"SyntaxError: Unexpected token: <. (ParseJSONRequest.js:2)\""
    
  2. Esamina la riga 2 nel file sorgente JavaScript (identificato nel passaggio 1 sopra) e controlla quale operazione viene eseguita. Se viene eseguita una funzione JSON.parse(), controlla il parametro di input passato. Se il parametro di input non è valido o è JSON con formato non corretto, è questa la causa dell'errore.

    Di seguito è riportato un esempio di codice JavaScript che genera questo errore:

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

    In questo esempio, il payload della richiesta (request.content) passato all'API Proxy viene utilizzato come input per la funzione JSON.parse().

    Ecco la chiamata API di esempio che mostra come è stata passata la richiesta:

    curl -v "http://<org>-<env>.apigee.net/v1/js-demo" -H "Content-Type: application/json" -X POST -d '<city>Bangalore</city>'
    

    Nella richiesta precedente, il seguente payload XML viene passato al proxy API <city>Bangalore</city>. L'API JSON.parse si aspetta che venga passato un JSON valido, ma poiché viene passato un payload XML, non va a buon fine con l'errore riportato di seguito:

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

Risoluzione

Assicurati di passare input validi alle API di analisi utilizzate nel codice JavaScript.

Per risolvere il problema relativo al criterio di esempio discusso sopra, passa una richiesta di payload JSON valida come segue:

curl -v "http://<org>-<env>.apigee.net/v1/js-demo" -H "Content-Type: application/json" -X POST -d '{"city" : "Bangalore"}'

Errore di tipo

Il tipo di errore TypeError viene generato quando:

  • Un operando o un argomento passato a una funzione non è compatibile con il tipo previsto da quell'operatore o funzione.
  • Una funzione viene invocata su un oggetto null, non definito o errato.
  • Viene eseguito l'accesso a una proprietà da un oggetto null, non definito o errato.

Ad esempio, viene generato un errore di tipo:

  • Se provi a invocare la funzione toUpperCase() su un numero. Questo accade perché la funzione toUpperCase() può essere richiamata solo su oggetti stringa.
  • Se tenti di leggere una proprietà da un oggetto null o undefined.

Corpo della risposta di errore

{
    "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"
        }
    }
}

Esempio 1: chiamata di una funzione sull'oggetto sbagliato

Se provi a invocare una funzione su un oggetto non supportato, viene visualizzato questo errore. Ad esempio, se provi a richiamare la funzione toUpperCase() su un numero, viene visualizzato l'errore. Questo perché la funzione toUpperCase() può essere invocata solo su oggetti stringa.

Esempio di testo della risposta di errore

{
    "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"
        }
    }
}

Diagnosi

  1. Identifica il criterio JavaScript, il relativo file di origine, il numero di riga in cui si è verificato l'errore e la descrizione dell'errore. Puoi trovare tutte queste informazioni nell'elemento faultstring della risposta all'errore. Ad esempio, nel seguente faultstring, il nome della norma JavaScript è ConvertToUpperCase, il file di origine è ConvertToUpperCase.js, il numero di riga è 2 e la descrizione dell'errore è **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)\""
    

    La descrizione dell'errore indica che stai chiamando la funzione toUpperCase() su un oggetto il cui valore numerico è 100.

  2. Esamina il file di origine JavaScript e verifica se stai richiamando la funzione toUpperCase() su un oggetto il cui valore numerico è 100 nella riga 2 (identificata nel passaggio 1 sopra). Se è così, è la causa dell'errore.

    Di seguito è riportato un file di origine JavaScript di esempio che genera questo errore:

    ConvertToUpperCase.js

    var number = 100;
    var result = number.toUpperCase();
    

    Nel codice JavaScript mostrato sopra, la variabile number è impostata su un valore pari a 100. Successivamente, la funzione toUpperCase()( viene invocata sull'oggetto numero. Poiché la funzione toUpperCase() può essere invocata solo su oggetti stringa, viene visualizzato l'errore:

    "Execution of ConvertToUpperCase failed with error: Javascript runtime error: \"TypeError: Cannot find function toUpperCase in object 100. (ConvertToUpperCase.js:2)\""
    

Risoluzione

Utilizza sempre funzioni come toUpperCase() su oggetti validi.

Per correggere l'esempio mostrato sopra, puoi creare una variabile stringa e poi invocare la funzione toUpperCase() su una stringa:

var text = "Hello Apigee !";
var result = text.toUpperCase();

Esempio 2: impossibile leggere la proprietà da un oggetto non definito

Se provi ad accedere/leggere una proprietà da un oggetto non definito, viene visualizzato questo errore. Ad esempio, questo errore può verificarsi quando si tenta di accedere ai dati di un oggetto in un array, ma l'oggetto non è definito. Consulta la spiegazione dettagliata riportata di seguito.

Esempio di testo della risposta di errore

{
    "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"
        }
    }
}

Diagnosi

  1. Identifica il criterio JavaScript, il relativo file di origine, il numero di riga in cui si è verificato l'errore e la descrizione dell'errore. Puoi trovare tutte queste informazioni nell'elemento faultstring della risposta all'errore. Ad esempio, nel seguente faultstring, il nome della norma è ParseJSONResponse, il file di origine è ParseJSONResponse.js, il numero di riga è 6 e la descrizione dell'errore è 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)\""
    

    L'errore indica che la proprietà length non può essere letta da un oggetto non definito.

  2. Esamina il numero di riga nel file di origine JavaScript (identificato nel passaggio 1 sopra) e verifica se l'oggetto ha un valore valido o è non definito. Potresti dover leggere e comprendere il file di origine completo per determinare in che modo l'oggetto specifico è stato definito o dedotto e perché non è definito. Se scopri che l'oggetto specifico non è definito e stai tentando di accedere alla lunghezza della proprietà, questa è la causa dell'errore.

    Vediamo un esempio per comprendere meglio il problema:

    1. Supponiamo che tu riceva la seguente risposta JSON dal server di backend:

      {
          "cars": [
             { "name":"Toyota", "count": 150 }
             { "name":"Honda", "count": 100 },
             { "name":"Ford", "count": 75 }
          ]
      }
      
    2. Ecco un file sorgente JavaScript di esempio che analizza questa risposta JSON e porta all'errore sopra indicato:

      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. Esaminando attentamente il codice JavaScript, puoi vedere che nella riga 2, response.contentviene letto/memorizzato nella variabile jsonData come una stringa normale (tra virgolette).

    4. Poiché jsonData è una stringa normale, quando provi ad accedere a cars da jsonData (jsonData.cars) non sarà definito.

    5. Di conseguenza, quando provi a leggere la proprietà length da jsonData.cars, che non è definita, viene visualizzato l'errore:

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

Risoluzione

Assicurati di leggere sempre i dati JSON come oggetto JSON utilizzando le API JSON pertinenti.

Per correggere l'esempio di codice JavaScript descritto sopra, puoi utilizzare la funzione JSON.parse() sull'oggetto response.content per ottenerlo come oggetto JSON. Dopodiché, puoi accedere all'array cars ed eseguire l'iterazione dell'array correttamente.

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

Errore URI

Il tipo di errore URIError viene generato se utilizzi caratteri non validi in una funzione URI. Ad esempio, se passi un URI contenente un simbolo di percentuale alle funzioni decodeURI o decodeURIComponent, viene visualizzato questo errore.

Corpo della risposta di errore

{
    "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"
        }
    }
}

Esempio di testo della risposta di errore

{
    "fault": {
        "faultstring": "Execution of URIDecode failed with error: Javascript runtime error: \"URIError: Malformed URI sequence. (URIDecode.js:2)\"",
        "detail": {
            "errorcode": "steps.javascript.ScriptExecutionFailed"
        }
    }
}

Diagnosi

  1. Identifica il criterio JavaScript, il relativo file di origine, il numero di riga in cui si è verificato l'errore e la descrizione dell'errore. Puoi trovare tutte queste informazioni nell'elemento faultstring della risposta di errore. Ad esempio, nella seguente stringa di errore, il nome della norma JavaScript è URIDecode</code, il file sorgente JavaScript è URIDecode.js, il numero di riga è 2 e la descrizione dell'errore è Malformed URI sequence:

    "faultstring": "Execution of URIDecode failed with error: Javascript runtime error: \"URIError: Malformed URI sequence. (URIDecode.js:2)\""
    

    La descrizione dell'errore indica che nella riga 2 di URIDecode.js viene utilizzata una sequenza URI con formato non corretto.

  2. Esamina il file sorgente JavaScript e verifica se l'argomento passato a una delle funzioni URI contiene caratteri non ammessi. Se la risposta è sì, è questa la causa dell'errore.

    Ecco un esempio di file sorgente JavaScript che genera questo errore:

    URIDecode.js

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

    Nell'esempio di codice JavaScript riportato sopra, la variabile str passata a decodeURIComponent() contiene un simbolo di percentuale, che è considerato un carattere non consentito; di conseguenza, viene visualizzato l'errore:

    "Execution of URIDecode failed with error: Javascript runtime error: \"URIError: Malformed URI sequence. (URIDecode.js:2)\""
    

Risoluzione

Assicurati che tutti i caratteri utilizzati nelle funzioni URI siano legali e consentiti.

Per risolvere il problema con l'esempio JavaScript descritto sopra, codifica il simbolo della percentuale. Ad esempio, %25:

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