TypeError: Impossible de lire la propriété 'get' de undefined à> ServerResponse.json?

Nov 20 2020

J'obtiens les erreurs suivantes en essayant de créer une fonction cloud simple qui détecte un like sur le RD, puis des annonces postées sur une chronologie utilisateur.

Comment puis-je corriger la fonction? Qu'est-ce que je fais mal?


(2 erreurs ci-dessous proviennent de la console des fonctions cloud Firebase)

1.

TypeError: impossible de lire la propriété 'get' de undefined sur ServerResponse.json (/workspace/node_modules/express/lib/response.js:257:20) sur ServerResponse.send (/workspace/node_modules/express/lib/response.js: 158: 21) à likerUIDRef.once.then.catch.error (/workspace/lib/index.js:669:52) à process._tickCallback (interne / process / next_tick.js: 68: 7)

Erreur: Processus terminé avec le code 16 à process.on.code (/layers/google.nodejs.functions-framework/functions-framework/node_modules/@google-cloud/functions-framework/build/src/invoker.js:275: 22) sur process.emit (events.js: 198: 13) sur process.EventEmitter.emit (domain.js: 448: 20) sur process.exit (interne / process / per_thread.js: 168: 15) sur Object. sendCrashResponse (/layers/google.nodejs.functions-framework/functions-framework/node_modules/@google-cloud/functions-framework/build/src/logger.js:37:9) sur process.on.err (/ layer / google.nodejs.functions-framework/functions-framework/node_modules/@google-cloud/functions-framework/build/src/invoker.js: 271: 22) à process.emit (events.js: 198: 13) au processus .EventEmitter.emit (domain.js: 448: 20) à emitPromiseRejectionWarnings (interne / process / promises.js: 140: 18) à process._tickCallback (interne / process / next_tick.js: 69: 34)

Typographie connexe:

 function addPersonalizedFYPPosts(whoLikes: string, postUID: string, postID: string) {
      
      //need to use data to fetch my latest likes
      //then I use the likers data to add the new post to his fypTimeline

      const ref = admin.database().ref(`Likes/${postUID}/${postID}/media1`);
      return ref.once("value") 
      .then(snapshot => {

        //use snapshot to get the my latest like ??
        //Now with this ssnapshot we see other people who liked the same post this liker has. get one of their UIDs and see what else they liked add that to thte likers timeline. 

        var i2 = 0

        snapshot.forEach((theChild) => {

          if (i2 == 0) {

            let uid = theChild.key
          
            //do what you want with the uid
  
            //const userWhoAlsoLiked = snapshot.forEach
  
            const likerUIDRef = admin.database().ref(`YourLikes/${uid}`); likerUIDRef.once("value") .then(snap =>{ //const username = snap.val() var i = 0 snap.forEach((child) => { //UserFYP if (i == 0) { let timelineID = child.key; let timeStamp = child.child("timeStamp").val(); let newPostID = child.child("postID").val(); let postUid = child.child("uid").val(); //admin.database().ref(`UserFYP/${whoLikes}/${timelineID}/`).update(["":""]) admin.database().ref(`UserFYP/${whoLikes}/${timelineID}/`).set({"postID": newPostID, "uid": postUid, "timeStamp": timeStamp})
                  .then(slap =>{
                    console.log("Success updating user FYP: " )
                    return Promise.resolve();
                  })
                  .catch(error => {
                    console.log("Error fetching likers username: " + error)
                    response.status(500).send(error);
                  })
                  i++;
                }
                // return;
              })
              
            })
            .catch(error => {
              console.log("Error fetching likers username: " + error)
              response.status(500).send(error)
            })
            
            return;
            
            i2++;
          }
      })

      })
      .catch(error => {
        console.log("The read failed: " + error)
        response.status(500).send(error)
      })  

    }

export const onPostLike = functions.database
.ref('/Likes/{myUID}/{postID}/media1/{likerUID}')
.onCreate((snapshot, context) => {
  const uid = context.params.likerUID
  const postID = context.params.postID
  const myUID = context.params.myUID
  //addNewFollowToNotif(uid, followerUID)

  return addPersonalizedFYPPosts(uid,myUID,postID);
})

Mettre à jour:

J'ai trouvé quelque chose d'intéressant, j'obtiens les 2 mêmes erreurs pour d'autres fonctions cloud. Et pourtant, ceux-ci fonctionnent toujours. Je crois donc que ces erreurs n'ont pas d'importance. Le problème persiste cependant. UserFYP n'est toujours pas mis à jour.

Mise à jour 2:

J'ai réduit le problème à un échec à cette ligne:

        admin.database().ref(`YourLikes/${uid}`).once("value")
        .then(snap =>{

(le bloc catch s'exécute)

Je ne sais pas pourquoi le thenne fonctionne pas. L'erreur que j'obtiens:

Erreur lors de la récupération du nom d'utilisateur de likers: Erreur: Reference.update a échoué: Le premier argument contient une fonction dans la propriété 'UserFYP.Bke7CYXP31dpyKdBGsiMOEov2q43.0PMdzaOyYBejf1Gh6Pk1RRA5WNJ2.postID.node_.children_.comparator_' avec le contenu de gauche NOM = fonction NOM_de_children_.comparator_ à gauche

Réponses

2 KevWats Nov 26 2020 at 08:32

Je pense que votre problème est que les fonctions ne sont pas réellement mises à jour pour une raison quelconque. Peut-être que votre dossier lib est le problème. Pour résoudre ce problème, je supprimerais tous vos fichiers de fonction Firebase, puis firebase initdepuis le début.

Enfin, assurez-vous que vos variables ne sont pas nulles.

          let timeStamp = child.child("timeStamp").val();
          let newPostID = child.child("postID").val();
          let postUid = child.child("uid").val();

Faites-moi savoir si cela verks.

1 RafaelLemos Nov 25 2020 at 00:23

Essayez de déplacer le timelineIDde la référence elle-même vers le child()de la référence. Comme l'exemple suivant:

admin.database()
     .ref(`UserFYP/${whoLikes}`)
     .child(timelineID)
     .set({"postID": newPostID, "uid": postUid, "timeStamp": timeStamp})

Si cela ne fonctionne pas, veuillez partager votre structure de base de données en temps réel, car cela faciliterait la vérification de ce que vous voulez réaliser et du format de vos données (je modifierai cette ligne si la réponse est correcte).

TahaMalik Nov 22 2020 at 23:51

modifier ces déclarations

let timeStamp = child.child("timeStamp");
let newPostID = child.child("postID");
let postUid = child.child("uid");

À:

let timeStamp = child.child("timeStamp").val();
let newPostID = child.child("postID").val();
let postUid = child.child("uid").val();

Explication:

https://firebase.google.com/docs/reference/node/firebase.database.DataSnapshot#child

ici, le mehtod enfant renvoie un DocumentSnapshot qui n'est pas une valeur que fireabase peut stocker.

Donc, la seule méthode qui renvoie une valeur est val

https://firebase.google.com/docs/reference/node/firebase.database.DataSnapshot#val