Ошибка Reference.update: первый аргумент содержит функцию в свойстве?

Nov 20 2020

Я получаю следующие ошибки при попытке создать простую облачную функцию, которая обнаруживает лайк на RD, а затем размещает объявления на временной шкале пользователя.

Как исправить функцию? Что я делаю неправильно?


(2 ошибки ниже из консоли облачных функций Firebase)

onPostLike

Ошибка при получении имени пользователя понравившегося пользователя: Ошибка: сбой обновления Reference.update: первый аргумент содержит функцию в свойстве UserFYP.Bke7CYXP31dpyKdBGsiMOEov2q43.0PMdzaOyYBejf1Gh6Pk1RRA5WNJ2.postID.node_.children_.comparator_OR_OR с содержимым

onPostLike

TypeError: невозможно прочитать свойство get of undefined на ServerResponse.json (/workspace/node_modules/express/lib/response.js:257:20) на ServerResponse.send (/workspace/node_modules/express/lib/response.js: 158: 21) в likerUIDRef.once.then.catch.error (/workspace/lib/index.js:669:52) в process._tickCallback (internal / process / next_tick.js: 68: 7)

Связанный машинописный текст:

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

Ответы

1 FrankvanPuffelen Nov 20 2020 at 09:10

Обращение child()к одному DataSnapshotдает вам другое DataSnapshot. Так:

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

В этом коде ваши локальные переменные представляют собой снимки состояния, которые содержат различные функции для доступа к ним. Поскольку в базу данных можно записывать только JSON, снимки не получают.

Вероятно, вы ищете:

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