TypeError: Kann die Eigenschaft 'get' von undefined unter> ServerResponse.json nicht lesen?
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 then
nicht 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
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 init
von 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.
Versuchen Sie, das timelineID
von 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).
Ä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