Résolution des erreurs d'exécution d'une règle JavaScript

Vous consultez la documentation d'Apigee et d'Apigee hybrid.
Consultez la documentation d'Apigee Edge.

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 :

  1. Si vous utilisez une date non valide telle que le 31 septembre 2018 avec certaines API Date.
  2. Si vous transmettez une valeur non valide à des méthodes numériques telles que Number.toPrecision(), Number.tofixed() ou Number.toExponential(). Par exemple, si vous transmettez une valeur de grande taille telle que 400 ou 500 dans la méthode Number.toPrecision(), une erreur de plage est renvoyée.
  3. 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

  1. 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 fichier faultstring suivant, le nom de la règle JavaScript est ParseDate, le fichier source JavaScript est ParseDate.js, le numéro de la ligne où l'erreur s'est produite est 2 et la description de l'erreur est Date is invalid :

    "faultstring": "Execution of ParseDate failed with error: Javascript runtime error: \"RangeError: Date is invalid. (ParseDate.js:2)\""
    
  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 variable date est définie avec une date 2018-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

  1. 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ément faultstring suivant, le nom de la règle JavaScript est SetNumberPrecision, le fichier source JavaScript est SetNumberPrecision.js, le numéro de la ligne où l'erreur s'est produite est 2 et la description de l'erreur est 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. 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 :

    SetNumberPrecision.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

  1. 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ément faultstring suivant, le nom de la règle JavaScript est ComputeTotalPrice, le fichier source correspondant est ComputeTotalPrice.js, le numéro de ligne où l'erreur s'est produite est 3 et le nom de la variable non définie est price.

    "faultstring": "Execution of ComputeTotalPrice failed with error: Javascript runtime error: \"ReferenceError: \"price\" is not defined. (ComputeTotalPrice.js:3)\""
    
  2. 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);
    
  3. 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

  1. 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 fichier faultstring suivant, le nom de la règle JavaScript est ParseJSONRequest, le fichier source JavaScript est ParseJSONRequest.js, le numéro de la ligne où l'erreur s'est produite est 2 et la description de l'erreur est Unexpected token :

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

  1. 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ément faultstring suivant, le nom de la règle JavaScript est ConvertToUpperCase, le fichier source est ConvertToUpperCase.js, le numéro de ligne est 2 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.

  2. 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 fonction toUpperCase()( est appelée sur l'objet numérique. Comme la fonction toUpperCase() 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

  1. 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ément faultstring suivant, le nom de la règle est ParseJSONResponse, le fichier source est ParseJSONResponse.js, le numéro de ligne est 6 et la description de l'erreur est 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'erreur indique que la propriété length ne peut pas être lue à partir d'un objet non défini.

  2. 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 :

    1. 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 }
          ]
      }
      
    2. 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);
        }
      
    3. En examinant attentivement le code JavaScript, vous pouvez constater que, à la ligne 2, la valeur response.content est lue/stockée dans la variable jsonData en tant que chaîne standard (entre guillemets).

    4. jsonData étant une chaîne standard, lorsque vous tentez d'accéder à cars à partir de jsonData (jsonData.cars) ne sera pas défini.

    5. Ensuite, lorsque vous tentez de lire la propriété length à partir de jsonData.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

  1. 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 est URIDecode.js, le numéro de ligne est 2 et la description de l'erreur est Malformed 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.

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