2017-04-04 1 views
0

기능은 proposals/{jobid}/{propid}을 준수합니다. 새 제안이 추가되고 child("isinvitation")이 널 (NULL)이면 함수는 proposals/sent에 새 노드를 성공적으로 기록한 다음 작업 jobs/${jobid}의 제안 하위에 증가분을 추가합니다.실행을 완료하기 전에 Firebase 용 클라우드 기능이 중단되었습니다.

제안이 제거되면 기능이 실패합니다. userRef.child(jobid).remove()도 실행되지 않으며 작업 jobs/${jobid}의 제안서 자식으로 감소하지 않습니다.

exports.CountProposals = functions.database.ref("/proposals/{jobid}/{propid}").onWrite((event) => { 
    const jobid = event.params.jobid; 
    const userId = event.params.propid; 
    const isinvitation = event.data.child("isinvitation").val(); 
    if (!isinvitation) { 
     const userRef = admin.database().ref(`users/${userId}/proposals/sent`); 
     if (event.data.exists() && !event.data.previous.exists()) { 
      userRef.child(jobid).set({ 
       timestamp: admin.database.ServerValue.TIMESTAMP 
      }); 
     } else if (!event.data.exists() && event.data.previous.exists()) { 
      userRef.child(jobid).remove(); 
     } 
    } 
    const collectionRef = admin.database().ref(`/jobs/${jobid}`); 
       return collectionRef.once('value').then(snapshot => { 
         if (snapshot.val() !== null) { 
          const countRef = collectionRef.child("proposals"); 
          countRef.transaction(current => { 
              if (event.data.exists() && !event.data.previous.exists()) { 
                  return (current || 0) + 1; 
              } else if (!event.data.exists() && event.data.previous.exists()) { 
                  return (current || 0) - 1; 
              } 
          }); 
         } 
       }); 
}); 

콘솔 로그에 오류가 표시되지 않습니다.

답변

0

함수가 여러 위치에서 여러 번 쓰기를 시도하고 있습니다. 이러한 각각의 쓰기는 완료를 추적하는 다른 약속을 생성합니다. 모든 작업이 완료되면 해결되는 단일 약속을 반환해야합니다. 지금 당장은 collectionRef.once('value').then()에서 단 하나의 약속 만 반환합니다.이 약속 자체는 거래 완료를 추적하는 또 다른 약속을 반환하지 않습니다.

기본적으로 약속을 사용하여 모든 기록을 추적하는 데주의해야하며 대개 Promise.all()을 사용하여 모든 뛰어난 작업을 기다립니다.

+0

event.data.child ("isinvitation")에 대한 null 값을 처리하고 있습니다. 그것은 이전 값을 사용하여 나에게 의미가 없습니다. –

+0

당신의 기능이 무엇을해야하는지는 내게 불분명하다. 당신은 주로 그것이 무엇인지 아닌지 말하는 것입니다. 또한 데이터베이스 업데이트와 같이 작동하는 함수에서 약속을 반환해야한다는 점을 명심하십시오. 지금은 업데이트 (제거, 트랜잭션)에서 반환되는 약속을 사용하고 있지 않습니다. –

+0

이 함수는 새로운 데이터와 isinvitation = false가'users/$ {userId}/proposals/sent' 데이터베이스에서 데이터를 쓰거나 제거한 다음'/ jobs/$ {jobid}'에 제안 된 값을 증가 시키거나 감소시킵니다 –

0

"Firebase Realtime Database 쓰기가 발생할 때마다 발생하는 이벤트 핸들러." - https://firebase.google.com/docs/reference/functions/functions.database.RefBuilder#onWrite

나는 개인적으로이뿐만 아니라, 그러나, 그것은 write 작업이 remove 작업으로 간주되지 AngularFire, 유사 할 수 있습니다 제거 작업에 트리거 얻을 것으로 예상 한 것이다.

당신이보고 당신이 당신의 상황을 작동시킬 수있는 방법을 볼 수 있습니다 : https://firebase.google.com/docs/reference/functions/functions.database.DeltaSnapshot#changed

편집 :를 그들이 나를 위해 제거를 트리거하는 것 내 자신의 일부 기능을 시도하는 후. 나는 당신의 코드를 더 살펴볼 것이다.

관련 문제