Reference.update a échoué: le premier argument contient une fonction dans la propriété?

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 les annonces publient 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)

onPostLike

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 Node_.children_.comparator_ à gauche

onPostLike

TypeError: impossible de lire la propriété 'get' d'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)

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"); let newPostID = child.child("postID"); let postUid = child.child("uid"); //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);
})

Réponses

1 FrankvanPuffelen Nov 20 2020 at 09:10

Faire appel child()à un DataSnapshotvous en donne un autre DataSnapshot. Alors:

  snap.forEach((child) => {
    //UserFYP
    if (i == 0) {
      let timelineID = child.key;
      let timeStamp = child.child("timeStamp");
      let newPostID = child.child("postID");
      let postUid = child.child("uid");

Dans ce code, vos variables locales sont des instantanés, qui contiennent des fonctions pour y accéder. Comme vous ne pouvez écrire que JSON dans la base de données, les instantanés sont rejetés.

Ce que vous recherchez probablement, c'est:

  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();