2 votes

obtenir une valeur d'identité à partir d'une base de données à l'aide de promesses

Je suis assez nouveau dans le monde des promesses, axios et le monde node-mssql. Je suis donc probablement en train de faire une erreur.

J'ai une application vue.js dans laquelle j'essaie d'insérer un enregistrement dans la table. J'espérais utiliser des promesses pour obtenir la valeur de l'identité de l'insertion que je viens d'effectuer.

La partie insertion fonctionne, mais la récupération et l'utilisation ne fonctionnent pas.

Voici mon code d'appel qui est enveloppé dans un Try/Catch (erreur ci-dessous) :

            var addFamilyMemberRowObj;

            axios
              .get("http://localhost:5000/addMember?familyId="+ vm.familyId+"&memberName="+vm.memberName+"&isAdmin="+vm.isParent)
              .then(response => (vm.returnId = response.data))
              .then(console.log(vm.returnId["Data"][0].id))
              .then(vm.memberId =  vm.returnId["Data"][0].id)
               .then(
                 addFamilyMemberRowObj = {
                  arrIndex: vm.addFamilyRowIndex,
                  familyId: vm.familyId,
                  familyName: vm.familyName,
                  familyMemberName: vm.memberName,
                  memberId: vm.memberId,
                  isParent: vm.isParent
                }
              )
              .then(vm.addFamilyRowArray.push(addFamilyMemberRowObj))
              .then(vm.addFamilyRowIndex = vm.addFamilyRowIndex + 1);  

Quelques éléments que vous devez connaître. returnId est un tableau. Je vous montrerai mon code DB ci-dessous. the vm.returnId["Data"][0].id est le seul moyen que je connaisse pour obtenir la valeur.

J'ai imprimé cette valeur en dehors de la promesse et elle finit par renvoyer une valeur. Ce qui m'amène à penser qu'il pourrait s'agir d'un problème de timing.

Le code de ma base de données est le suivant :

app.get('/addMember', function(req,res){
    var data = {
              "Data":""
      };

      try 
      {
          const pool7 = new sql2.ConnectionPool(config, err => {
              pool7.request()
              .query("INSERT INTO Member (FamilyId, MemberName, isAdmin)VALUES("+ req.query.familyId +",'" + req.query.memberName + "', '" + req.query.isAdmin + "') SELECT SCOPE_IDENTITY() as id", (err, result) => {
                  data["Data"] = result.recordset;
                  console.log(data);

                  res.json(data);
              })
          })

      } catch (err) {
          console.log("hasLogin: " + err)
      }     
});

Après cet appel, j'ai vérifié que l'insertion fonctionne (et que la console.log imprime également la valeur correcte [à partir de ce code]) :

{ Données : [ { id : 24 } ] }

Quand je regarde le console.log du code vue, j'obtiens le message suivant :

"Unable to get property '0' of undefined or null reference" (Impossible d'obtenir la propriété '0' d'une référence indéfinie ou nulle)

Cependant, comme je l'ai mentionné, si j'imprime vm.returnId["Data"][0].id en dehors de la promesse, j'obtiens finalement une valeur lors des appels suivants (l'id est 1 derrière).

Je sais que la syntaxe est correcte en ce qui concerne l'obtention de la valeur, mais à l'intérieur de la promesse, cela ne fonctionne pas.

Je sais qu'il y a beaucoup de choses à déballer. Je fais probablement beaucoup de choses de travers. Comme vous pouvez le constater, beaucoup de ces extraits de code proviennent directement des échantillons. Toute aide serait la bienvenue.

1voto

wanjas Points 364

La racine du problème est que then attend une fonction comme argument. .then(console.log(vm.returnId["Data"][0].id)) est un appel erroné.

Il devrait être .then(() => console.log(vm.returnId["Data"][0].id))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X