TypeError: Nie można odczytać właściwości „get” o wartości undefined w> ServerResponse.json?

Nov 20 2020

Otrzymuję następujące błędy, kiedy próbuję utworzyć prostą funkcję w chmurze, która wykrywa coś podobnego na RD, a następnie umieszcza reklamy na osi czasu użytkownika.

Jak mogę naprawić tę funkcję? Co ja robię źle?


(2 błędy poniżej pochodzą z konsoli funkcji chmury Firebase)

1.

TypeError: Nie można odczytać właściwości „get” o wartości undefined w ServerResponse.json (/workspace/node_modules/express/lib/response.js:257:20) w ServerResponse.send (/workspace/node_modules/express/lib/response.js: 158: 21) pod adresem likerUIDRef.once.then.catch.error (/workspace/lib/index.js:669:52) pod adresem process._tickCallback (internal / process / next_tick.js: 68: 7)

Błąd: proces zakończył się z kodem 16 pod adresem process.on.code (/layers/google.nodejs.functions-framework/functions-framework/node_modules/@google-cloud/functions-framework/build/src/invoker.js:275: 22) w process.emit (events.js: 198: 13) w process.EventEmitter.emit (domain.js: 448: 20) w process.exit (internal / process / per_thread.js: 168: 15) w Object. sendCrashResponse (/layers/google.nodejs.functions-framework/functions-framework/node_modules/@google-cloud/functions-framework/build/src/logger.js:37:9) w process.on.err (/ layer / google.nodejs.functions-framework/functions-framework/node_modules/@google-cloud/functions-framework/build/src/invoker.js: 271: 22) w process.emit (events.js: 198: 13) w procesie .EventEmitter.emit (domain.js: 448: 20) w emitPromiseRejectionWarnings (internal / process / promises.js: 140: 18) at process._tickCallback (internal / process / next_tick.js: 69: 34)

Powiązany typopis:

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

Aktualizacja:

Znalazłem coś interesującego, otrzymuję te same 2 błędy również dla innych funkcji chmury. A jednak te nadal działają. Dlatego uważam, że te błędy nie mają znaczenia. Jednak problem nadal występuje. UserFYP nadal nie jest aktualizowany.

Aktualizacja 2:

Ograniczyłem problem do awarii na tej linii:

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

(blok zaczepu działa)

Nie jestem pewien, dlaczego thennie działa. Błąd jaki otrzymuję:

Błąd podczas pobierania nazwy użytkownika Likers: Błąd: Aktualizacja pliku referencyjnego nie powiodła się: Pierwszy argument zawiera funkcję we właściwości „UserFYP.Bke7CYXP31dpyKdBGsiMOEov2q43.0PMdzaOyYBejf1Gh6Pk1RRA5WNJ2.postID.node_.children_.comparator_C” z zawartością = prawy ARMATOR_NAZWA (funkcja po lewejARATOR_C)

Odpowiedzi

2 KevWats Nov 26 2020 at 08:32

Uważam, że problemem jest to, że z jakiegoś powodu funkcje nie są aktualizowane. Może twój folder lib jest problemem. Aby to naprawić, usunąłbym wszystkie pliki funkcji Firebase, a następnie firebase initod początku. Wcześniejsze

Na koniec upewnij się, że twoje zmienne nie są zerowe. Wcześniejsze

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

Daj mi znać, jeśli to verks.

1 RafaelLemos Nov 25 2020 at 00:23

Spróbuj przenieść timelineIDz samego odniesienia do child()odniesienia. Jak w poniższym przykładzie:

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

Jeśli to nie zadziała, udostępnij swoją strukturę bazy danych w czasie rzeczywistym, ponieważ ułatwiłoby to sprawdzenie, co chcesz osiągnąć i format, jaki mają Twoje dane (wyedytuję tę linię, jeśli odpowiedź jest poprawna).

TahaMalik Nov 22 2020 at 23:51

zmodyfikuj te oświadczenia

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

DO:

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

Wyjaśnienie:

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

tutaj mehtod potomny zwraca DocumentSnapshot, który nie jest wartością, którą może przechowywać fireabase.

Tak więc jedyną metodą, która zwraca wartość, jest val

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