Realtime Database triggers (pt. 3) with Cloud Functions for Firebase | Firecasts

더그 스티븐슨 : 나와 함께 해줘서 고마워 이 시리즈의이 세 번째 파트는 클라우드를 사용하여 실시간 데이터베이스 트리거 작성에 대한 정보 Firebase의 기능

내 이름은 더그 야 그리고 제가 여기에서 여러분에게 말하고자하는 것은 처음 두 사람의 것과 같습니다 동영상이므로 반드시 돌아가서 처음 시청하시기 바랍니다 아직 안 왔으면 처음 두 개의 동영상에서 클라우드 기능을 사용하여 몇 가지 트리거를 작성한 방법 자동으로 단어 "피자"를 피자 그림 이모티로 바 꾸었습니다

대화방에서 왜? 왜냐하면 그것은 pizzazz를 추가하기 때문입니다 이러한 트리거는 새로 추가 된 메시지에 응답합니다 또한 업데이트 된 메시지 처음에 추가되었습니다 그러나 당신이 응답하고 싶다면 어떻게합니까? 삭제 된 메시지에? 글쎄, 네가 놀랄 일은 아닌데

onDelete 트리거로 처리하십시오 그리고 그것을 사용하고 싶습니다 그러나 이번에는 실제로 피자를 포함하지 않습니다 내가 원하는 것은 대화방에 대한 것입니다 메시지를 쉽게 조회 할 수 있습니다

메시지 개수가 필요한 이유는 무엇입니까? 글쎄, 나는 클라이언트 애플 리케이션을하고 싶습니다 얼마나 많은 메시지가 방에 있는지 알 수있다 쿼리, 다운로드 및 계산없이 그 방에있는 모든 메시지 아이들 셀 수 없을 때 할 일은 너무 많습니다 그래서 저는 두 가지 일을 할 것입니다

먼저 기존 onCreate 트리거를 변경합니다 메시지 수를 읽고, 증가시키고, 쓰려면 새로운 메시지가 방에 추가 될 때 둘째, onDelete 트리거를 새로 추가하겠습니다 메시지 수를 읽고, 감소시키고, 쓰려면 어떤 이유로 메시지가 삭제 될 때 새 아이에게이 계산서를 저장하겠습니다

같은 레벨에있는 방의 노드 값 메시지 노드로 이것은 메시지로 증가 및 감소 할 값입니다 추가되고 제거됩니다 승인 코드를 살펴 보겠습니다

사실, 아니 나는 이것을 먼저 생각하고 계획을 세워야한다 코드를 작성하기 전에 당신이 명심해야 할 중요한 한가지가 있습니다 클라우드 기능 코드 작성

함수를 호출 할 때마다 같은 시간에 실행 중일 수 있습니다 그들은 순차적으로 하나씩 실행하지 않습니다 이 전략은 전혀 확장되지 않습니다 대신 Cloud 기능의 런타임 함수를 병렬로 실행할 수 있어야합니다 부하시

많은 사람들이 방에서 채팅한다고 상상해보십시오 각자가 메시지를 추가하고 삭제할 때, 그들은 모두 그 방의 메시지 수를 업데이트해야합니다 여기의 문제는 이와 같습니다 onCreate 및 onDelete의 각 호출 기존 메시지를 읽을 필요가있다 데이터베이스에서 방을 계산하고, 기억 속에서 그것에 변화를 주었다

다시 같은 장소로 그러나 당신은 쉽게 상황을 가질 수 있습니다 여기서 두 함수 호출, let 's onCreate와 onDelete가 동시에 실행되고 있다고 가정합니다 그리고 그들은 둘 다 처음에 같은 메시지 수를 읽었습니다 데이터베이스에서 변경 로컬 메모리에 무엇이든간에 값 중 하나 잘못 다른 사람을 덮어 씁니다

우리는 그것이 어느 것이 될지조차 모릅니다 이 다이어그램의이 상황에서 메시지 개수는 원래 4입니다 두 개의 함수가이 함수를 변경하려고 시도 할 때, 새 메시지 수는 3 또는 5가 될 것입니까? 4 번으로 돌아가고 싶습니다 증가와 감소 후에 그러나 여기에서, 최종 결과는 명백하게 쓰기가 완료되는 순서와 상관없이 잘못되었습니다 이 상황을 경쟁 조건이라고합니다

그게 제가 뭔가를하지 않으면 여기에있을 문제입니다 그것을 수정하십시오 좋은 소식은 데이터베이스로 쉽게 해결할 수 있다는 것입니다 트랜잭션 코드에서 어떻게 작동하는지 살펴 보겠습니다

먼저이 onCreate 함수가 업데이트 호출에서 약속을 반환합니다 이후로는 더 이상 작동하지 않습니다 업데이트가 완료되면 트랜잭션을 수행해야합니다 여기서 할 수있는 일은 비동기 사용을 기다리는 것입니다 먼저,이 핸들러 함수를 만들어 보겠습니다

비동기는 정의가 시작되는 키워드를 사용합니다 그런 다음 "return"대신 "await"키워드를 사용하겠습니다 업데이트가 완료 될 때까지 코드를 일시 중지합니다 그 후에 참조를 만들어야합니다 데이터베이스 내의 카운터의 위치로, 스냅 샷 심판을 시작으로 사용할 수 있습니다

이는 생성 된 노드의 위치를 ​​가리 킵니다 그런 다음 두 노드를 나무 위로 올립니다 참조의 parent 속성을 사용합니다 이제 방의 노드를 가리키는 참조가 있습니다 방에서 / [? roomId?]

이 위치에있는 메시지 개수 아이가 필요합니다 그래서 다른 참조를 만들기 위해 child 메소드를 사용할 것이다 그걸로 countRef가 참조하는 값은 다음과 같습니다 읽고 쓰기, 쓰기, 쓰기

이 참조에서 트랜잭션 메소드를 사용하겠습니다 트랜잭션을 수행합니다 트랜잭션 업데이트 기능이 필요합니다 그 함수는 값을 받는다 참조 위치에있는 데이터베이스의 이름

여기, 그 위치에서 메시지 카운트 값을 기대하고 있습니다 그리고 저는 그것을 단순히 증분하고 리턴 할 것입니다 트랜잭션에 새로운 값을 다시 쓰라고 알려주는 것입니다 이제 onDelete 트리거를 작성합니다 그것은 onCreate와 같으므로 복사하여 붙여 넣습니다

물론 이름을 바꾸어야합니다 또한 onCreate에서 트랜잭션을 복사합니다 내가 똑같이 될거야 이번에는 카운터 그리고 나는 여전히 거래에서 그 약속을 되돌려 줄 필요가 있습니다

그렇게해야합니다 이제 내 onCreate와 onDelete가 함께 작업하고 있습니다 각 방의 메시지 수를 관리합니다 사용중인 거래는 그들이 원자로라고 말하면서 중단의 가능성, 우리가 더 이상 존재하지 않는다는 것을 의미한다 경쟁 조건

코드에 경주의 가능성이없는 경우 조건을 지정하고 트랜잭션을 전혀 사용하지 마십시오 그것은 불필요하게 물건을 늦출뿐입니다 그러므로 신중하게 상황을 생각하십시오 실시간 데이터베이스 트랜잭션에 대해 더 자세히 알고 싶다면, 설명서를 읽으십시오 링크는 아래 설명에 있습니다

하지만 지금 당장이 코드를 테스트하여 어떻게 작동하는지 확인하고 싶습니다 이 연재물의 첫 번째 동영상을 기억한다면, 일련의 메시지를 추가하는 것을 시뮬레이트하는 스크립트가 있습니다 대화방에 나는 그것을 실행하고 Firebase에서 결과를 관찰 할 것입니다 콘솔

승인 명령 줄에서 스크립트를 실행합니다 메시지를 시뮬 레이팅하는 것을 확인하십시오 동시에, 콘솔에서 메시지가 나타납니다 그리고 메시지 수를 볼 수도 있습니다

각각의 새 메시지가 올라갑니다 그런 다음 콘솔에서 모든 메시지를 삭제하면 카운터 드롭이 0으로 되돌아가는 것을 볼 수 있습니다 그거 꽤 재미있어, 그렇지? 괜찮아 코드가 완료되었지만 한 가지 더 있습니다 onDelete에 대해 알고 싶습니다

아마도 핸들러 함수가 스냅 샷을 전달 받았다는 것을 알았을 것입니다 첫 번째 매개 변수로 개체 해당 스냅 샷에는 이전 데이터가 포함되어 있습니다 방금 방아쇠의 위치에서 삭제되었습니다 그러나 당신이 그 대상을 전혀 사용하지 않거나 문맥을 사용하지 않는다면, 당신은 핸들러 함수 정의에서 그것들을 남겨 둘 수 있습니다 그냥 물건을 깨끗하게 유지하는 것

승인 onCreate, onUpdate 및 onDelete 사용 클라우드 기능에서 트리거하면 모든 종류의 유용한 작업을 수행 할 수 있습니다 데이터베이스 변경에 대한 응답으로 그리고 onWrite 트리거도 있습니다 모든 변경 사항에 대해 해고 당할 수있는 또한 onCreate, onDelete 또는 onUpdate가 실행됩니다 그러나 스냅 샷 변경 사항을 파헤쳐 야합니다

무슨 일이 일어 났는지 정확히 알아 내기 그래서 나는 다른 세 가지 트리거를 사용합니다 그들이 더 쉽기 때문에 모든 경우에 해킹으로부터 코드가 안전합니다 언제든지 로직을 업데이트 할 수 있습니다

앱을 다시 빌드하고 게시 할 필요가 없습니다 클라우드 기능은 강력합니다 하지만 그들과 함께 일한 후에 쓰기, 배포 및 테스트 속도가 느리다 귀하의 기능을 반복적으로 클라우드 기능을 사용하여 해당주기의 속도를 높일 수 있습니다

에뮬레이터 그리고 데이터베이스를 위해 어떻게하는지 보여 드리겠습니다 다음에 트리거합니다 그러므로 Firebase 채널에 바로 접속하십시오 YouTube에서 동영상을 볼 수 있습니다

그리고 나는 너를 볼거야 [음악 재생]