TypeError: Não é possível ler a propriedade 'get' de undefined em> ServerResponse.json?

Nov 20 2020

Estou recebendo os seguintes erros ao tentar fazer uma função de nuvem simples que detecta um like no RD e, em seguida, publica anúncios na linha do tempo do usuário.

Como posso corrigir a função? O que estou fazendo errado?


(2 erros abaixo são do console de funções de nuvem do Firebase)

1

TypeError: Não é possível ler a propriedade 'get' de undefined em ServerResponse.json (/workspace/node_modules/express/lib/response.js:257:20) em ServerResponse.send (/workspace/node_modules/express/lib/response.js: 158: 21) em likerUIDRef.once.then.catch.error (/workspace/lib/index.js:669:52) em process._tickCallback (internal / process / next_tick.js: 68: 7)

Erro: processo encerrado com o código 16 em process.on.code (/layers/google.nodejs.functions-framework/functions-framework/node_modules/@google-cloud/functions-framework/build/src/invoker.js:275: 22) em process.emit (events.js: 198: 13) em process.EventEmitter.emit (domain.js: 448: 20) em process.exit (internal / process / per_thread.js: 168: 15) em Object. sendCrashResponse (/layers/google.nodejs.functions-framework/functions-framework/node_modules/@google-cloud/functions-framework/build/src/logger.js:37:9) em process.on.err (/ layers / 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) no processo .EventEmitter.emit (domain.js: 448: 20) em emitPromiseRejectionWarnings (internal / process / promises.js: 140: 18) em process._tickCallback (internal / process / next_tick.js: 69: 34)

Texto datilografado relacionado:

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

Atualizar:

Achei algo interessante, também recebo os mesmos 2 erros para outras funções de nuvem. E ainda assim eles funcionam. Portanto, acredito que esses erros não importam. O problema ainda persiste. UserFYP ainda não está atualizado.

Atualização 2:

Limitei o problema a uma falha nesta linha:

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

(o bloco de captura é executado)

Não tenho certeza porque o thennão funciona. O erro que recebo:

Erro ao buscar nome de usuário de likers: Erro: Reference.update falhou: O primeiro argumento contém uma função na propriedade 'UserFYP.Bke7CYXP31dpyKdBGsiMOEov2q43.0PMdzaOyYBejf1Gh6Pk1RRA5WNJ2.postID.node_.children_.comparator_' com conteúdo {NAME_COMPARATOR, à direita, à direita = função {NAME_COMPARATOR, à direita)

Respostas

2 KevWats Nov 26 2020 at 08:32

Acredito que seu problema é que as funções não estão sendo atualizadas por algum motivo. Talvez sua pasta lib seja o problema. Para corrigir isso, eu excluiria todos os seus arquivos de função do Firebase e, em seguida, firebase initdesde o início.

Por último, certifique-se de que suas variáveis ​​não sejam nulas.

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

Deixe-me saber se isso verks.

1 RafaelLemos Nov 25 2020 at 00:23

Experimente mover o timelineIDda própria referência para o child()da referência. Como o seguinte exemplo:

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

Se isso não funcionar, compartilhe sua estrutura de banco de dados em tempo real, pois tornaria mais fácil verificar o que você deseja alcançar e o formato que seus dados têm (irei editar esta linha se a resposta estiver correta).

TahaMalik Nov 22 2020 at 23:51

modificar essas declarações

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

PARA:

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

Explicação:

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

aqui, o mehtod filho retorna um DocumentSnapshot que não é um valor que o fireabase pode armazenar.

Portanto, o único método que retorna um valor é val

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