TypeError: Kann die Eigenschaft 'get' von undefined unter> ServerResponse.json nicht lesen?

Nov 20 2020

Ich erhalte die folgenden Fehler, wenn ich versuche, eine einfache Cloud-Funktion zu erstellen, die ein "Gefällt mir" auf dem RD erkennt und dann Beiträge auf einer Benutzerzeitleiste anzeigt.

Wie kann ich die Funktion reparieren? Was mache ich falsch?


(2 Fehler unten sind von der Firebase Cloud-Funktionskonsole)

1.

TypeError: Die Eigenschaft 'get' von undefined kann unter ServerResponse.json (/workspace/node_modules/express/lib/response.js:257:20) unter ServerResponse.send (/workspace/node_modules/express/lib/response.js) nicht gelesen werden. 158: 21) unter likerUIDRef.once.then.catch.error (/workspace/lib/index.js:669:52) unter process._tickCallback (internal / process / next_tick.js: 68: 7)

Fehler: Der Prozess wurde mit Code 16 unter process.on.code beendet (/layers/google.nodejs.functions-framework/functions-framework/node_modules/@google-cloud/functions-framework/build/src/invoker.js:275: 22) at process.emit (events.js: 198: 13) at process.EventEmitter.emit (domain.js: 448: 20) at process.exit (internal / process / per_thread.js: 168: 15) at Object. sendCrashResponse (/layers/google.nodejs.functions-framework/functions-framework/node_modules/@google-cloud/functions-framework/build/src/logger.js:37:9) unter process.on.err (/ layer / google.nodejs.functions-framework/functions-framework/node_modules/@google-cloud/functions-framework/build/src/invoker.js: 271: 22) at process.emit (events.js: 198: 13) at process .EventEmitter.emit (domain.js: 448: 20) bei emitPromiseRejectionWarnings (intern / process / versprechen.js: 140: 18) bei process._tickCallback (intern / process / next_tick.js: 69: 34)

Verwandte Typoskript:

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

Aktualisieren:

Ich fand etwas interessantes, ich bekomme die gleichen 2 Fehler auch für andere Cloud-Funktionen. Und doch funktionieren diese immer noch. Daher glaube ich, dass diese Fehler keine Rolle spielen. Das Problem besteht jedoch weiterhin. UserFYP wird immer noch nicht aktualisiert.

Update 2:

Ich habe das Problem auf einen Fehler in dieser Zeile eingegrenzt:

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

(der Fangblock läuft)

Ich bin mir nicht sicher, warum das thennicht läuft. Der Fehler, den ich bekomme:

Fehler beim Abrufen des Benutzernamens von Likern: Fehler: Reference.update fehlgeschlagen: Das erste Argument enthält eine Funktion in der Eigenschaft 'UserFYP.Bke7CYXP31dpyKdBGsiMOEov2q43.0PMdzaOyYBejf1Gh6Pk1RRA5WNJ2.postID.node_.children_.comparator_'

Antworten

2 KevWats Nov 26 2020 at 08:32

Ich glaube, Ihr Problem ist, dass die Funktionen aus irgendeinem Grund nicht aktualisiert werden. Vielleicht ist Ihr lib-Ordner das Problem. Um dies zu beheben, würde ich alle Ihre Firebase-Funktionsdateien löschen und dann firebase initvon Anfang an. .

Stellen Sie schließlich sicher, dass Ihre Variablen nicht null sind. .

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

Lassen Sie mich wissen, ob dies verks.

1 RafaelLemos Nov 25 2020 at 00:23

Versuchen Sie, das timelineIDvon der Referenz selbst in child()die Referenz zu verschieben. Wie das folgende Beispiel:

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

Wenn dies nicht funktioniert, teilen Sie bitte Ihre Echtzeit-Datenbankstruktur mit, da dies die Überprüfung Ihrer gewünschten Ziele und des Formats Ihrer Daten erleichtert (ich werde diese Zeile bearbeiten, wenn die Antwort korrekt ist).

TahaMalik Nov 22 2020 at 23:51

Ändern Sie diese Anweisungen

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

ZU:

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

Erklärung:

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

Hier kann das Kind einen DocumentSnapshot zurückgeben, der kein Wert ist, den Fireabase speichern kann.

Die einzige Methode, die einen Wert zurückgibt, ist val

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