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
Le norme JavaScript possono 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 RangeError se utilizzi un numero al di fuori dell'intervallo di valori legali. |
| Errore di riferimento | Viene generato un 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 al di fuori dell'intervallo di tipi previsti. |
| Errore URI | Viene generato un URIError se utilizzi caratteri non ammessi in una funzione URI. |
Errore di intervallo
Il tipo di errore RangeError viene generato quando operi su un valore o trasmetti un valore
a una funzione che non rientra nell'insieme o nell'intervallo di valori consentiti.
Ad esempio, questo errore viene generato nelle seguenti circostanze:
- Se utilizzi una data non valida, ad esempio 31 settembre 2018, con alcune API Date.
- Se trasmetti un valore non valido a metodi numerici come
Number.toPrecision(),Number.tofixed()oNumber.toExponential(). Ad esempio, se trasmetti un valore elevato come 400 o 500 nel metodoNumber.toPrecision(), verrà visualizzato un errore di intervallo. - 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 dalle norme JavaScript. Di seguito sono descritti alcuni esempi per tuo riferimento.
Esempio 1: data non valida
Esempio di corpo 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
Identifica la policy 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
faultstringdella risposta di errore. Ad esempio, nel seguentefaultstring, il nome della norma JavaScript èParseDate, il file di origine JavaScript èParseDate.js, il numero di riga in cui si è verificato l'errore è2e la descrizione dell'errore èDate is invalid:"faultstring": "Execution of ParseDate failed with error: Javascript runtime error: \"RangeError: Date is invalid. (ParseDate.js:2)\""Esamina il file sorgente JavaScript (identificato nel passaggio 1 sopra) e controlla se nella riga specificata nell'errore viene utilizzata una data non valida o se la variabile utilizzata nel numero di riga contiene una data non valida. Se viene utilizzata una data non valida, questa è la causa dell'errore.
Ecco 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 numero 2 viene utilizzata una variabile
date. Esaminando il file di origine, puoi notare che la variabiledateè 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 l'esempio di codice JavaScript mostrato sopra, puoi impostare la data come 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 corpo 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
Identifica la policy 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
faultstringdella risposta di errore. Ad esempio, nel seguentefaultstring, il nome della norma JavaScript èSetNumberPrecision, il file di origine 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)\""Esamina il file di origine JavaScript (identificato nel passaggio 1 riportato sopra). Se il numero elevato menzionato nella descrizione dell'errore viene utilizzato nel numero di riga specifico, questa è la causa dell'errore.
Ecco 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, nota che nella riga numero 2 viene utilizzato un valore elevato di 400. Poiché non puoi impostare la precisione su un numero così elevato di cifre, viene visualizzato l'errore riportato di seguito:
"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 dei valori consentiti.
Per risolvere il problema con l'esempio di JavaScript descritto sopra, imposta il numero di cifre significative su 2, che è un valore 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 una variabile non definita in JavaScript
viene utilizzata (a cui viene fatto riferimento) o su cui viene eseguita un'operazione.
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 corpo 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
Identifica il criterio JavaScript, il relativo file di origine e il numero di riga in cui viene fatto riferimento alla variabile non definita. Puoi trovare tutte queste informazioni nell'elemento
faultstringdella risposta di errore. Ad esempio, nel seguentefaultstring, il nome della policy JavaScript èComputeTotalPrice, il file di origine corrispondente èComputeTotalPrice.js, il numero di riga in cui si è verificato l'errore è3e 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)\""Esamina il numero di riga nel file di origine JavaScript e verifica se viene fatto riferimento alla variabile non definita identificata nel passaggio 1 precedente. Ad esempio, il seguente codice JavaScript fa riferimento alla variabile non definita
pricenella riga 3, che corrisponde a quanto riportato 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);Controlla se la variabile specifica è definita all'interno del codice JavaScript. Se la variabile non è definita, questa è la causa dell'errore.
Nello script di esempio mostrato sopra, viene utilizzata la variabile
pricenon dichiarata/definita, pertanto verrà 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 JavaScript mostrato sopra, definisci la variabile price prima di utilizzarla. 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 viene passato un input di formato non valido
alle API dell'analizzatore sintattico, ad esempio l'analisi JSON/XML.
Ad esempio, se il payload JSON non valido o malformato 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 corpo 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
Identifica la policy 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
faultstringdella risposta di errore. Ad esempio, nel seguentefaultstring, il nome della norma JavaScript èParseJSONRequest, il file di origine JavaScript èParseJSONRequest.js, il numero di riga in cui si è verificato l'errore è2e la descrizione dell'errore èUnexpected token:"faultstring": "Execution of ParseJSONRequest failed with error: Javascript runtime error: \"SyntaxError: Unexpected token: <. (ParseJSONRequest.js:2)\""Esamina la riga numero 2 nel file sorgente JavaScript (identificato nel passaggio 1 riportato sopra) e controlla l'operazione eseguita. Se viene eseguita una funzione
JSON.parse(), controlla il parametro di input passato. Se il parametro di input non è valido o è un JSON malformato, questo è il motivo dell'errore.Ecco un codice JavaScript di esempio 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 al proxy API viene utilizzato come input per la funzioneJSON.parse().Ecco la chiamata API di esempio che mostra come è stata trasmessa 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'APIJSON.parseprevede il passaggio di un JSON valido, ma poiché viene passato un payload XML, si verifica l'errore riportato di seguito:"Execution of ParseJSONRequest failed with error: Javascript runtime error: \"SyntaxError: Unexpected token: <. (ParseJSONRequest.js:2)\""
Risoluzione
Assicurati di trasmettere un input valido alle API di analisi utilizzate nel codice JavaScript.
Per risolvere il problema relativo al criterio di esempio descritto sopra, trasmetti una richiesta di payload JSON valida nel seguente modo:
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 richiamata su un oggetto nullo, indefinito o errato.
- Si accede a una proprietà da un oggetto null, indefinito o errato.
Ad esempio, viene generato un errore di tipo:
- Se tenti di chiamare la funzione
toUpperCase()su un numero. Questo perché la funzionetoUpperCase()può essere richiamata solo su oggetti stringa. - Se tenti di leggere una proprietà da un oggetto nullo o indefinito.
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: richiamo di una funzione sull'oggetto sbagliato
Se tenti di richiamare 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 richiamata solo su
oggetti stringa.
Esempio di corpo 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
Identifica la policy 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
faultstringdella risposta di errore. Ad esempio, nel seguentefaultstring, il nome della norma JavaScript èConvertToUpperCase, il file di origine èConvertToUpperCase.js, il numero di riga è2e 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 richiamando la funzione
toUpperCase()su un oggetto il cui valore numerico è 100.Esamina il file di origine JavaScript e verifica se stai richiamando la funzione
toUpperCase()su un oggetto il cui valore numerico è 100 alla riga numero 2 (identificata nel passaggio 1 sopra). In caso affermativo, questa è la causa dell'errore.Ecco 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 con un valore di 100. Successivamente, la funzionetoUpperCase()(viene richiamata sull'oggetto numerico. Poiché la funzionetoUpperCase()può essere richiamata 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 richiamare
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 tenti di accedere/leggere una proprietà da un oggetto non definito, riceverai questo errore. Ad esempio, questo errore può verificarsi quando tenti di accedere ai dati da un oggetto in un array, ma l'oggetto non è definito. Vedi la spiegazione dettagliata di seguito.
Esempio di corpo 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
Identifica la policy 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
faultstringdella risposta di errore. Ad esempio, nel seguentefaultstring, il nome della norma èParseJSONResponse, il file di origine èParseJSONResponse.js, il numero di riga è6e 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.
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 è indefinito. Potresti dover leggere e comprendere l'intero file di origine per determinare come è stato definito o derivato l'oggetto specifico e perché risulta non definito. Se riscontri che l'oggetto specifico è effettivamente indefinito e stai tentando di accedere alla proprietà length, questo è il motivo dell'errore.
Vediamo un esempio per capire meglio il problema:
Supponi di ricevere la seguente risposta JSON dal server di backend:
{ "cars": [ { "name":"Toyota", "count": 150 } { "name":"Honda", "count": 100 }, { "name":"Ford", "count": 75 } ] }Ecco un file di origine JavaScript di esempio che analizza questa risposta JSON e genera l'errore menzionato sopra:
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); }Esaminando attentamente il codice JavaScript, puoi notare che nella riga numero 2,
response.contentviene letto/memorizzato nella variabilejsonDatacome stringa normale (tra virgolette).Poiché
jsonDataè una stringa normale, quando tenti di accedere acarsdajsonData(jsonData.cars) non sarà definito.Successivamente, quando tenti di leggere la proprietà
lengthdajsonData.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 JavaScript descritto sopra, puoi utilizzare la funzione JSON.parse()
sull'oggetto response.content per ottenerlo come oggetto JSON. Dopodiché, puoi accedere all'array cars e iterarlo 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 ammessi in una funzione URI.
Ad esempio, se passi un URI con un simbolo di percentuale alle funzioni decodeURI o
decodeURIComponent, riceverai 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 corpo 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
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 faultstring, il nome della norma JavaScript è
URIDecode</code, il file di origine JavaScript èURIDecode.js, il numero di riga è2e 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.jsviene utilizzata una sequenza URI non valida.Esamina il file di origine JavaScript e verifica se l'argomento passato a una delle funzioni URI contiene caratteri non ammessi. In caso affermativo, questo è il motivo 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);Nel codice JavaScript di esempio mostrato sopra, la variabile
strpassata adecodeURIComponent()contiene un simbolo di percentuale, considerato un carattere non valido. Pertanto, 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 relativo all'esempio di JavaScript descritto sopra, codifica il simbolo di percentuale. Ad esempio, %25:
var str = "75%25-Completed";
var decoded_str = decodeURIComponent(str);
context.setVariable("decoded_str", decoded_str);