Vous consultez la documentation d'Apigee Edge.
Accédez à la documentation sur Apigee X. info
ScriptExecutionFailed
Code d'erreur
steps.javascript.ScriptExecutionFailed
Corps de la réponse d'erreur
{ "fault": { "faultstring": "Execution of javascript_policy_name failed with error: error_type: error_description. (javascript_source_file_name)\"", "detail": { "errorcode": "steps.javascript.ScriptExecutionFailed" } } }
Types d'erreurs et causes possibles
La règle JavaScript peut générer de nombreux types d'erreurs ScriptExecutionFailed. Le tableau ci-dessous répertorie Les erreurs les plus courantes sont répertoriées dans le tableau ci-dessous :
Type d'erreur | Cause |
Erreur de plage | Une erreur RangeError est générée si vous utilisez un nombre qui n'est pas compris dans la plage de valeurs autorisées. |
Erreur de référence | Une erreur ReferenceError est générée si vous utilisez (référencez) une variable non déclarée. |
Erreur de syntaxe | Une erreur SyntaxError est générée si vous essayez d'évaluer le code comportant une erreur de syntaxe. |
Erreur de type | Une erreur TypeError est générée si vous utilisez une opération située en dehors de la plage des types attendus. |
Erreur d'URI | Une erreur URIError est générée si vous utilisez des caractères non autorisés dans une fonction d'URI. |
Erreur de plage
Le type d'erreur RangeError
est déclenché lorsque vous utilisez une valeur ou transmettez une valeur à une fonction qui ne se trouve pas dans l'ensemble ou la plage de valeurs autorisées.
Par exemple, cette erreur est générée dans les cas suivants :
- Si vous utilisez une date non valide telle que le 31 septembre 2018 avec certaines API Date.
- Si vous transmettez une valeur non valide à des méthodes numériques telles que
Number.toPrecision()
,Number.tofixed()
ouNumber.toExponential()
. Par exemple, si vous transmettez une valeur de grande taille telle que 400 ou 500 dans la méthodeNumber.toPrecision()
, une erreur de plage est renvoyée. - Si vous créez un tableau d'une longueur non autorisée.
Corps de la réponse d'erreur
{ "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" } } }
Remarque : Le diagnostic et la résolution des erreurs de plage dépendent du message d'erreur exact généré par la règle JavaScript. Voici quelques exemples :
Exemple 1 : Date non valide
Exemple de corps de réponse d'erreur
{
"fault": {
"faultstring": "Execution of ParseDate failed with error: Javascript runtime error: \"RangeError: Date is invalid. (ParseDate.js:2)\"",
"detail": {
"errorcode": "steps.javascript.ScriptExecutionFailed"
}
}
}
Diagnostic
Identifiez la règle JavaScript, son fichier source, le numéro de la ligne où l'erreur s'est produite et la description de l'erreur. Vous trouverez toutes ces informations dans l'élément
faultstring
de la réponse d'erreur. Par exemple, dans le fichierfaultstring
suivant, le nom de la règle JavaScript estParseDate
, le fichier source JavaScript estParseDate.js
, le numéro de la ligne où l'erreur s'est produite est2
et la description de l'erreur estDate is invalid
:"faultstring": "Execution of ParseDate failed with error: Javascript runtime error: \"RangeError: Date is invalid. (ParseDate.js:2)\""
Examinez le fichier source JavaScript (identifié à l'étape 1 ci-dessus) et vérifiez si une date n'est pas valide dans le numéro de ligne spécifié dans l'erreur ou si la variable utilisée dans le numéro de ligne comporte une date non valide. Si une date non valide est utilisée, il s'agit de la cause de l'erreur.
Voici un exemple de fichier source JavaScript qui génère cette erreur :
ParseDate.js
var date = new Date('2018-09-31T11:19:08.402Z'); date.toISOString();
Dans cet exemple, la ligne numéro 2 comporte une variable
date
. En examinant le fichier source, vous pouvez constater que la variabledate
est définie avec une date2018-09-31T11:19:08.402Z.
qui n'est pas valide, car le mois de septembre ne compte que 30 jours.Remarque : Le format ISO-8601 utilisé dans cet exemple est le suivant :
YYYY-MM-DDTHH:mm:ss.sssZ
Solution
Veillez à toujours spécifier une date valide lorsque vous utilisez des API Date dans le code JavaScript.
Pour corriger l'exemple de code JavaScript ci-dessus, vous pouvez définir la date comme suit : Sept 30 2018
var date = new Date('2018-09-30T11:19:08.402Z');
date.toISOString();
Exemple 2 : Numéro transmis aux API Precision non valide
Exemple de corps de réponse d'erreur
{
"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"
}
}
}
Diagnostic
Identifiez la règle JavaScript, son fichier source, le numéro de la ligne où l'erreur s'est produite et la description de l'erreur. Vous trouverez toutes ces informations dans l'élément
faultstring
de la réponse d'erreur. Par exemple, dans l'élémentfaultstring
suivant, le nom de la règle JavaScript estSetNumberPrecision
, le fichier source JavaScript estSetNumberPrecision.js
, le numéro de la ligne où l'erreur s'est produite est 2 et la description de l'erreur estPrecision 400 out of range.
"faultstring": "Execution of SetNumberPrecision failed with error: Javascript runtime error: "RangeError: Precision 400 out of range. (SetNumberPrecision.js:2)\""
Examinez le fichier source JavaScript (identifié à l'étape 1 ci-dessus). Si le grand nombre indiqué dans la description de l'erreur est utilisé dans le numéro de ligne spécifique, il s'agit de la cause de l'erreur.
Voici un exemple de fichier source JavaScript qui génère cette erreur :
SetNumberPrécision.js
var number = 12.3456; var rounded_number = number.toPrecision(400); print("rounded_number = " + rounded_number);
Dans cet exemple, vous remarquerez qu'une grande valeur 400 est utilisée à la ligne 2. Comme vous ne pouvez pas définir la précision sur un si grand nombre de chiffres, l'erreur ci-dessous est renvoyée :
"faultstring": "Execution of SetNumberPrecision failed with error: Javascript runtime error: "RangeError: Precision 400 out of range. (SetNumberPrecision.js:2)\""
Solution
Assurez-vous que le nombre utilisé dans la méthode toPrecision()
se situe dans l'ensemble de valeurs autorisées.
Pour résoudre le problème dans l'exemple de code JavaScript décrit ci-dessus, définissez le nombre de chiffres significatifs sur 2, ce qui est valide :
var number = 12.3456;
var rounded_number = number.toPrecision(2);
print("rounded_number = " + rounded_number);
Erreur de référence
Le type d'erreur ReferenceError
est déclenché lorsqu'une variable non définie dans votre code JavaScript est utilisée (référencée) ou exécutée.
Corps de la réponse d'erreur
{ "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" } } }
Exemple de corps de réponse d'erreur
{
"fault": {
"faultstring": "Execution of ComputeTotalPrice failed with error: Javascript runtime error: \"ReferenceError: \"price\" is not defined. (ComputeTotalPrice.js:3)\"",
"detail": {
"errorcode": "steps.javascript.ScriptExecutionFailed"
}
}
}
Diagnostic
Identifiez la règle JavaScript, son fichier source et le numéro de ligne où la variable non définie est référencée. Vous trouverez toutes ces informations dans l'élément
faultstring
de la réponse d'erreur. Par exemple, dans l'élémentfaultstring
suivant, le nom de la règle JavaScript estComputeTotalPrice
, le fichier source correspondant estComputeTotalPrice.js
, le numéro de ligne où l'erreur s'est produite est3
et le nom de la variable non définie estprice.
"faultstring": "Execution of ComputeTotalPrice failed with error: Javascript runtime error: \"ReferenceError: \"price\" is not defined. (ComputeTotalPrice.js:3)\""
Examinez le numéro de ligne dans le fichier source JavaScript et assurez-vous que la variable non définie identifiée à l'étape 1 ci-dessus est référencée. Par exemple, le code JavaScript suivant référence la variable non définie
price
dans la ligne 3, ce qui correspond à ce qui se trouve dans la chaîne d'erreur :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);
Vérifiez si la variable spécifique est définie dans le code JavaScript. Si la variable n'est pas définie, il s'agit de la cause de l'erreur.
Dans l'exemple de script illustré ci-dessus, la variable
price
non déclarée/définie est utilisée. Par conséquent, l'erreur ci-dessous est renvoyée :"faultstring": "Execution of ComputeTotalPrice failed with error: Javascript runtime error: \"ReferenceError: \"price\" is not defined. (ComputeTotalPrice.js:3)\""
Solution
Vérifiez que toutes les variables référencées dans le code JavaScript sont correctement définies.
Pour résoudre le problème dans l'exemple de code JavaScript ci-dessus, définissez le prix variable avant de l'utiliser. Exemple :
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);
Erreur de syntaxe
Le type d'erreur SyntaxError
est déclenché lorsque le moteur JavaScript rencontre des jetons ou un ordre de jeton non conforme à la syntaxe de la langue, ou lorsqu'une entrée de format non valide est transmise aux API d'analyseur telles que l'analyse JSON/XML.
Par exemple, cette erreur est renvoyée si la charge utile JSON non valide ou au format incorrect est transmise en tant qu'entrée à l'API JSON.parse
utilisée dans la règle JavaScript.
Corps de la réponse d'erreur
{ "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" } } }
Exemple de corps de réponse d'erreur
{
"fault": {
"faultstring": "Execution of ParseJSONRequest failed with error: Javascript runtime error: \"SyntaxError: Unexpected token: <. (ParseJSONRequest.js:2)\"",
"detail": {
"errorcode": "steps.javascript.ScriptExecutionFailed"
}
}
}
Diagnostic
Identifiez la règle JavaScript, son fichier source, le numéro de la ligne où l'erreur s'est produite et la description de l'erreur. Vous trouverez toutes ces informations dans l'élément
faultstring
de la réponse d'erreur. Par exemple, dans le fichierfaultstring
suivant, le nom de la règle JavaScript estParseJSONRequest
, le fichier source JavaScript estParseJSONRequest.js
, le numéro de la ligne où l'erreur s'est produite est2
et la description de l'erreur estUnexpected token
:"faultstring": "Execution of ParseJSONRequest failed with error: Javascript runtime error: \"SyntaxError: Unexpected token: <. (ParseJSONRequest.js:2)\""
Examinez la ligne numéro 2 dans le fichier source JavaScript (identifié à l'étape 1 ci-dessus) et vérifiez l'opération en cours d'exécution. Si une fonction
JSON.parse()
est en cours d'exécution, vérifiez le paramètre d'entrée transmis. Si le paramètre d'entrée n'est pas valide ou présente un format JSON incorrect, il s'agit de la cause de l'erreur.Voici un exemple de code JavaScript qui génère cette erreur :
var input = context.getVariable("request.content"); var result = JSON.parse(input);
Dans cet exemple, la charge utile de la requête (
request.content
) transmise au proxy d'API est utilisée comme entrée de la fonctionJSON.parse()
.Voici un exemple d'appel d'API qui illustre comment la requête a été transmise :
curl -v "http://<org>-<env>.apigee.net/v1/js-demo" -H "Content-Type: application/json" -X POST -d '<city>Bangalore</city>'
Dans la requête ci-dessus, la charge utile XML suivante est transmise au proxy d'API
<city>Bangalore</city>
. L'APIJSON.parse
s'attend à recevoir un fichier JSON valide, mais comme une charge utile XML est transmise à la place, elle échoue avec l'erreur suivante :"Execution of ParseJSONRequest failed with error: Javascript runtime error: \"SyntaxError: Unexpected token: <. (ParseJSONRequest.js:2)\""
Solution
Assurez-vous de transmettre une entrée valide aux API d'analyse utilisées dans le code JavaScript.
Pour résoudre le problème dans l'exemple de règle décrit ci-dessus, transmettez une requête de charge utile JSON valide comme suit :
curl -v "http://<org>-<env>.apigee.net/v1/js-demo" -H "Content-Type: application/json" -X POST -d '{"city" : "Bangalore"}'
Erreur de type
Le type d'erreur TypeError
est déclenché dans les cas suivants :
- Un opérande ou un argument transmis à une fonction est incompatible avec le type attendu par cet opérateur ou cette fonction.
- Une fonction est appelée sur un objet NULL, non défini ou incorrect.
- Une propriété est accessible à partir d'un objet NULL, non défini ou incorrect.
Par exemple, une erreur de type est généré dans les cas suivants :
- Si vous tentez d'appeler la fonction
toUpperCase()
sur un nombre. En effet, la fonctiontoUpperCase()
ne peut être appelée que sur des objets de chaîne. - Si vous tentez de lire une propriété à partir d'un objet NULL ou non défini.
Corps de la réponse d'erreur
{ "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" } } }
Exemple 1 : Appeler une fonction sur le mauvais objet
Si vous tentez d'appeler une fonction sur un objet non compatible, cette erreur se produit.
Par exemple, si vous tentez d'appeler la fonction toUpperCase()
sur un nombre obtenu, l'erreur est renvoyée. En effet, la fonction toUpperCase()
ne peut être appelée que sur des objets de chaîne.
Exemple de corps de réponse d'erreur
{
"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"
}
}
}
Diagnostic
Identifiez la règle JavaScript, son fichier source, le numéro de la ligne où l'erreur s'est produite et la description de l'erreur. Vous trouverez toutes ces informations dans l'élément
faultstring
de la réponse d'erreur. Par exemple, dans l'élémentfaultstring
suivant, le nom de la règle JavaScript estConvertToUpperCase
, le fichier source estConvertToUpperCase.js
, le numéro de ligne est2
et la description de l'erreur est **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 description de l'erreur indique que vous appelez la fonction
toUpperCase()
sur un objet dont la valeur numérique est égale à 100.Examinez le fichier source JavaScript et vérifiez si vous appelez la fonction
toUpperCase()
sur un objet dont la valeur numérique est de 100 à la ligne 2 (identifiée à l'étape 1 ci-dessus). Si c'est le cas, alors il s'agit de la cause de l'erreur.Voici un exemple de fichier source JavaScript qui génère cette erreur :
ConvertToUpperCase.js
var number = 100; var result = number.toUpperCase();
Dans le code JavaScript ci-dessus, la variable
number
est définie sur la valeur 100. Ensuite, la fonctiontoUpperCase()(
est appelée sur l'objet numérique. Comme la fonctiontoUpperCase()
ne peut être appelée que sur les objets de chaîne, l'erreur suivante est renvoyée :"Execution of ConvertToUpperCase failed with error: Javascript runtime error: \"TypeError: Cannot find function toUpperCase in object 100. (ConvertToUpperCase.js:2)\""
Solution
Utilisez toujours des fonctions telles que toUpperCase()
sur des objets valides.
Pour corriger l'exemple ci-dessus, vous pouvez créer une variable de chaîne, puis appeler la fonction toUpperCase()
sur une chaîne :
var text = "Hello Apigee !";
var result = text.toUpperCase();
Exemple 2 : Impossible de lire la propriété à partir d'un objet non défini
Si vous tentez d'accéder à une propriété ou de la lire à partir d'un objet non défini, cette erreur est renvoyée. Par exemple, l'erreur peut se produire lorsque vous tentez d'accéder aux données d'un objet dans un tableau, mais que l'objet n'est pas défini. Reportez-vous à l'explication détaillée ci-dessous.
Exemple de corps de réponse d'erreur
{
"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"
}
}
}
Diagnostic
Identifiez la règle JavaScript, son fichier source, le numéro de la ligne où l'erreur s'est produite et la description de l'erreur. Vous trouverez toutes ces informations dans l'élément
faultstring
de la réponse d'erreur. Par exemple, dans l'élémentfaultstring
suivant, le nom de la règle estParseJSONResponse
, le fichier source estParseJSONResponse.js
, le numéro de ligne est6
et la description de l'erreur estCannot 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'erreur indique que la propriété length ne peut pas être lue à partir d'un objet non défini.
Examinez le numéro de ligne dans le fichier source JavaScript (identifié à l'étape 1 ci-dessus) et vérifiez si l'objet a une valeur valide ou non définie. Il se peut que vous deviez examiner le fichier source complet pour déterminer la façon dont l'objet spécifique a été défini ou dérivé, et pour déterminer pourquoi l'objet n'est pas défini. Si vous constatez que l'objet spécifique n'est pas défini alors que vous tentez d'accéder à la longueur de la propriété, il s'agit de la cause de l'erreur.
Voici un exemple qui nous permettra de mieux comprendre ce problème :
Supposons que vous receviez la réponse JSON suivante du serveur backend :
{ "cars": [ { "name":"Toyota", "count": 150 } { "name":"Honda", "count": 100 }, { "name":"Ford", "count": 75 } ] }
Voici un exemple de fichier source JavaScript qui analyse cette réponse JSON et génère l'erreur mentionnée ci-dessus :
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); }
En examinant attentivement le code JavaScript, vous pouvez constater que, à la ligne 2, la valeur
response.content
est lue/stockée dans la variablejsonData
en tant que chaîne standard (entre guillemets).jsonData
étant une chaîne standard, lorsque vous tentez d'accéder àcars
à partir dejsonData
(jsonData.cars
) ne sera pas défini.Ensuite, lorsque vous tentez de lire la propriété
length
à partir dejsonData.cars
, qui n'est pas définie, l'erreur suivante est renvoyée :"faultstring": "Execution of ParseJSONResponse failed with error: Javascript runtime error: \"TypeError: Cannot read property \"length\" from undefined. (ParseJSONResponse.js:6)\""
Solution
Assurez-vous de toujours lire les données JSON en tant qu'objet JSON à l'aide des API JSON correspondantes.
Pour corriger l'exemple de code JavaScript ci-dessus, vous pouvez utiliser la fonction JSON.parse()
de l'objet response.content
pour l'obtenir en tant qu'objet JSON. Vous pouvez ensuite accéder au tableau cars
et effectuer des itérations avec le tableau.
// 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);
}
Erreur d'URI
Le type d'erreur URIError
est renvoyé si vous utilisez des caractères non autorisés dans une fonction d'URI.
Par exemple, si vous transmettez un URI qui comporte un symbole de pourcentage aux fonctions decodeURI
ou decodeURIComponent
, cette erreur est renvoyée.
Corps de la réponse d'erreur
{ "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" } } }
Exemple de corps de réponse d'erreur
{
"fault": {
"faultstring": "Execution of URIDecode failed with error: Javascript runtime error: \"URIError: Malformed URI sequence. (URIDecode.js:2)\"",
"detail": {
"errorcode": "steps.javascript.ScriptExecutionFailed"
}
}
}
Diagnostic
Identifiez la règle JavaScript, son fichier source, le numéro de la ligne où l'erreur s'est produite et la description de l'erreur. Vous pouvez retrouver toutes ces informations dans l'élément "faultstring" de la réponse d'erreur. Par exemple, dans la chaîne d'erreur suivante, le nom de la règle JavaScript est
URIDecode</code
, le fichier source JavaScript estURIDecode.js
, le numéro de ligne est2
et la description de l'erreur estMalformed URI sequence
:"faultstring": "Execution of URIDecode failed with error: Javascript runtime error: \"URIError: Malformed URI sequence. (URIDecode.js:2)\""
La description de l'erreur indique qu'une séquence d'URI incorrecte est utilisée à la ligne 2 de
URIDecode.js
.Examinez le fichier source JavaScript et vérifiez si l'argument transmis à l'une des fonctions de l'URI contient des caractères non autorisés. Si oui, il s'agit de la cause de l'erreur.
Voici un exemple de fichier source JavaScript qui génère cette erreur :
URIDecode.js
var str = "75%-Completed"; var decoded_str = decodeURIComponent(str); context.setVariable("decoded_str", decoded_str);
Dans l'exemple de code JavaScript ci-dessus, la variable
str
transmise àdecodeURIComponent()
comporte un symbole de pourcentage, considéré comme un caractère non autorisé. L'erreur suivante est donc renvoyée :"Execution of URIDecode failed with error: Javascript runtime error: \"URIError: Malformed URI sequence. (URIDecode.js:2)\""
Solution
Assurez-vous que tous les caractères utilisés dans les fonctions d'URI sont légaux et autorisés.
Pour résoudre le problème dans l'exemple de code JavaScript décrit ci-dessus, encodez le symbole de pourcentage. Exemple, %25
.
var str = "75%25-Completed";
var decoded_str = decodeURIComponent(str);
context.setVariable("decoded_str", decoded_str);