0

J'essaie d'insérer des données dans le stockage de table à partir de l'instruction d'insertion SQL Azure EasyTables mais context.execute() est appelé avant la création de la table dans table stockage qui arrête ma connexion même si le code pour créer une nouvelle table est placé avant context.execute(). Quelqu'un pourrait-il me dire comment je pourrais caler la fonction context.execute jusqu'à ce que je finisse de mettre en place mon stockage de table. Voici mon code. Merci pour l'aideAzure Node: accès au stockage de table à partir de SQL Azure Easy insertion de tables

table.insert(function (context) { 
    var azure = require('azure-storage'); 
    var tableService = azure.createTableService('NAME', 'KEY'); 

    context.user.getIdentity().then((data) => { 
     tableService.createTableIfNotExists('UserInfo', function(error, result) { 
      if (error) { 
       //do something 
      }else { 

       var entGen = azure.TableUtilities.entityGenerator; 
       var task = { 
        PartitionKey: entGen.String(context.user.id), 
        RowKey: entGen.String('1'), 
        name : entGen.String(data.facebook.claims.name), 
        email : entGen.String(data.facebook.claims.emailaddress), 
        createdOn: entGen.DateTime(new Date(Date.UTC(2016, 3, 27))), 
       }; 

       tableService.insertEntity('UserInfo',task, function (error, result, resp) { 
        if(!error){ 
         //respond with success message 
        }else{ 
         //respond with failure message 
        } 
       }); 
      } 
     }); 
    }); 

     context.item.userId = context.user.id; 
     return context.execute(); //This line is executed before I get success/failure response from table storage 

}); 

Répondre

0

J'ai écrit le tableService.createTableIfNotExists (...); dans une nouvelle fonction, puis appelez la fonction depuis l'opération "use"

table.insert.use (insertMiddleware, table.operation);

0

C'est parce que getIdentity() retourne un objet Promise.

Le code then((data) => { ... }) sera exécuté après son invocation réussie.

Plus de détails sur la façon dont fonctionne Promise.then(), pls voir here

Vous pouvez écrire le code tableService.createTableIfNotExists(...); dans une méthode et appeler la méthode context.execute().

+0

Mais Alex, ne devrait pas alors ((data) => {...}) s'exécuter avant la méthode context.execute() et je devrais quand même être capable de créer une table? ou êtes-vous en train de dire context.execute arrive d'abord puis vient le alors ((data) => {...}) –

+0

Je veux dire que lorsque votre code s'exécutera à 'context.user.getIdentity()', le programme va vérifier si ' getIdentity() 'renvoie une erreur, sinon' then ((data) => {...}) 'sera exécuté en même temps, ce qui insère une nouvelle entité dans la table. Je pense que le 'context.execute()' est inutile ici. Vous pouvez faire comme ceci: 1) déplacer le code tableService.createTableIfNotExists (...); dans une méthode et appelez la méthode dans context.execute(). ou 2) supprimer 'context.execute()'. –

+0

Merci Alex mais si je supprime le context.execute() que j'ai essayé précédemment, je reçois l'erreur L'élément n'existe pas. La méthode "insert" attend une déclaration return. et toute déclaration de retour que je place dans un contexte. execute(), cette instruction s'exécute à nouveau avant la création de la table, donc je suis de retour à la case 1. J'ai corrigé mon problème, voir ma réponse ci-dessous. Le middleware "use" s'exécute toujours avant l'opération de table jusqu'à ce que je spécifie de passer à l'opération de table. donc j'ai déplacé tout mon code là –