1

Je suis un peu confus sur la façon de refactoriser mon code pour lire et écrire sans les promesses imbriquées. Lors de l'écriture d'un objet, si cet objet a un drapeau, je veux mettre à jour son objet "related" avec le nouveau nombre. J'ai deux problèmes.Comment gérer une lecture et écrire des fonctions Cloud Firestore

1) Promesses imbriquées à partir de la lecture puis de l'écriture. 2) Que dois-je retourner

exports.updateRelationshipCounts = functions.firestore 
    .document('masterProduct/{nfCode}').onWrite((event) => { 

    //on writing of record: 

    var newProduct = event.data.data(); 
    if (newProduct.isGlutenFreeYN === 'Y') { 
     console.log('Gluten Free'); 

     //Update GF count in the Brand Object: 

     var db = admin.firestore(); 
     var docRef = db.collection("masterBrand").doc(newProduct.brandNFCode); 
     var doc = docRef.get() 
      .then(doc => { 

       doc.glutenFreeCount = doc.glutenFreeCount + 1 


       docRef.set(newProduct.brand) 
        .then(function() { 
         console.log("Document successfully written!"); 
        }) 
        .catch(function (error) { 
         console.error("Error writing document: ", error); 
        }); 

       }) 
      .catch(err => { 
        console.log('Error getting document', err); 
      }) 
    }; 

}); 

De plus, il me veut retourner quelque chose ... nul?

+0

Qui veut que vous retourniez quelque chose? Le gestionnaire d'événements '.onWrite()'? Aucun des gestionnaires '.onWrite()' dans le document [doc ici] (https://firebase.google.com/docs/functions/firestore-events) n'affiche quoi que ce soit renvoyé. – jfriend00

Répondre

4

Vous pouvez utiliser le chaînage et éliminer une partie de l'imbrication.

exports.updateRelationshipCounts = functions.firestore 
    .document('masterProduct/{nfCode}').onWrite((event) => { 
    //on writing of record: 
    var newProduct = event.data.data(); 
    if (newProduct.isGlutenFreeYN === 'Y') { 
     console.log('Gluten Free'); 
     //Update GF count in the Brand Object: 

     var db = admin.firestore(); 
     var docRef = db.collection("masterBrand").doc(newProduct.brandNFCode); 
     docRef.get().then(doc => { 
      doc.glutenFreeCount = doc.glutenFreeCount + 1 
      return docRef.set(newProduct.brand); 
     }).then(() => { 
      console.log("document successfully written); 
     }).catch(err => { 
      // will log all errors in one place 
      console.log(err); 
     }); 
    } 
}); 

Changements:

  1. chaîne au niveau supérieur plutôt que de plus en plus profonde imbrication.
  2. Renvoyez les promesses imbriquées pour qu'elles s'enchaînent correctement.
  3. Consolidez les gestionnaires d'erreur pour un .catch()