Realtime Database triggers (pt. 1) with Cloud Functions for Firebase – Firecasts

DOUG STEVENSON : 안녕하세요 내 이름은 Doug이고 저는 개발자 옹호자입니다

Firebase 팀과 많은 분들이 Firebase Realtime을 사용하고 있습니다 응용 프로그램의 백엔드 데이터베이스 특히, 그것은 채팅방을 구현하는 것입니다 그러나 더 많은 기능을 추가하려고 할 수도 있습니다 모든 클라이언트간에 로직을 복제 할 필요없이 앱을 사용하고 코드를 해커로부터 격리 할 수 ​​있습니다

앱이 작동하는 방식을 바꿀 수도 있습니다 클라우드 기능으로 이러한 작업을 수행 할 수 있습니다 여러 개의 대화방이있는 앱이 있습니다 데이터베이스는 다음과 같이 보입니다 "rooms"이라는 최상위 노드가 있습니다

각 룸에 고유 ID가있는 해당 하위 노드 아래에 있습니다 그런 다음 각 회의실 내에 '메시지'라는 또 다른 노드가 있습니다 고유 한 푸시 ID가있는 채팅 메시지가 포함되어 있습니다 이 메시지들 각각은 하위 값을가집니다 메시지 본문과 그 사람의 이름 누가 보냈습니까? 이것은 괜찮습니다

여기서 잘못된 것은 없습니다 그러나 우리가 방금 본 것은 분명히 대화에 의해 움직이는 피자에 관한 대화방 "Inside Out"이라는 영화에서 나는 아주 좋아했다 그러나 나는 그것에 약간의 피자를 추가하고 싶다 더 많은 피자를 사용하는 것보다 pizzazz를 추가하는 것이 더 좋은 방법일까요? 피자 그림 이예요 재미 있지? 모든 사건이 깔끔하다면 어떨까요? 이 채팅에서 '피자'라는 단어가 이모티콘으로 바뀌 었습니까? 모든 로직을 클라이언트에 코딩 할 수 있습니다

그러나 그것은 각 클라이언트가 올바르게 이것을 할 것을 요구합니다 지원하는 각 클라이언트 플랫폼에 대해, 각 클라이언트의 새 버전을 게시해야합니다 모든 것을 동기화 상태로 유지합니다 블레 오히려이 기능을 한 번만 추가하지 않겠습니까? 모든 클라이언트 앱에 대해 각각을 변경하고 게시 하시겠습니까? 좋은 데, 맞지? 이제 Firebase 용 Cloud Functions를 사용하여이를 수행하는 방법을 살펴 보겠습니다

실시간 데이터베이스로 작업 할 때, 응답을 위해 사용할 수있는 네 가지 유형의 트리거가 있습니다 데이터베이스 변경 이것들은 onCreate, onUpdate, onDelete, onWrite입니다 이들 각각의 트리거는 백 엔드 관리에서 실행될 수 있습니다 클라우드 기능 별

새로운 노드가 데이터베이스에 추가 된 후 OnCreate 트리거, 기존 데이터가 변경된 후 onUpdate 트리거, 노드가 삭제 된 후에 onDelete가 트리거됩니다 이러한 모든 변경 사항으로 OnWrite 트리거, 그러나 당신은 당신의 코드에서 어떤 종류의 변화를 알아 내야 만한다 그것은 이러한 각각의 경우에, 데이터베이스에서 이러한 트리거 및 해당 위치의 영향을받습니다 와일드 카드 경로 구성 요소를 포함 할 수 있으며, 나는 나중에 설명 할 것이다

오늘 나는 창조에 대해서 이야기 할 것이고, 그 다음에는 다른 트리거들 미래의 비디오에서 하지만 쉽게 쓰기 때문에 쓰기를 건너 뛸 것입니다 다른 세 사람과 일하기 위해서 onCreate 트리거를 사용할 것입니다 대신 피자 그림 이모티콘을 사용하도록 사람들의 새 메시지를 다시 쓰려면 "피자"라는 단어가 매우 쉽습니다

이 대체를 할 수 있습니다 한 번 보자 내 프로젝트에는 이미 스크립트가 있습니다 내가 앞서 보여준 대화를 만듭니다 그것은 테스트에 매우 유용합니다

이 유형 스크립트 코드에는 많은 상용구가 있습니다 그러나 알아야 할 것은 시뮬레이트하는 것입니다 그들을 밀어서 몇몇 메시지의 추가 미리 결정된 위치에서 데이터베이스에 저장합니다 나는 지금 당장 그것을 실행하여 당신이하는 일을 볼 수 있습니다 내가 터미널로 가서 스크립트를 실행할 때, 각 메시지를 데이터베이스에 푸시합니다

하드 코딩 된 룸 ID를 사용하여 약간 지연되었습니다 Firebase에서이 파일이 작동하는 것을 볼 수 있습니다 각 메시지가 개별적으로 추가 될 때 실시간으로 콘솔 이제 VS 코드로 돌아가십시오 이러한 메시지에 일부 피자를 추가하려면, Firebase SDK 용 Cloud Functions를 사용해야합니다

실시간 데이터베이스 트리거를 작성하고 내보낼 수 있습니다 ref 메소드를 사용하여 알려줄 것입니다 경로 밑의 변화에 ​​반응한다 "rooms", 와일드 카드 룸 ID, 메시지, 와일드 카드 메시지 ID 중괄호 안에있는 두 개의 와일드 카드 경로의 자식 노드와 일치합니다

필자가 작성해야하는 코드를 작성하고 있으므로 노드가 새로 생성 될 때마다 실행되고, 나는 이것을 onCreate 방아쇠로 만들 것이다 자, 내가 무엇을 만들어야하는지 알고 싶으면, onCreate 심볼을 간단히 명령을 클릭하면됩니다 VS 코드가 나를 그것의 타입 스크립트 정의로 데려 가기 위해 함수 SDK 내부 Linux 및 Windows의 경우 대신 Ctrl 키를 누른 상태로 클릭합니다 이제는 onCreate에 핸들러 함수가 필요하다는 것을 알 수 있습니다

그 자체가 두 가지 주장을합니다 – 데이터 스냅 샷 및 이벤트 컨텍스트 – 해결할 약속을 되 돌린다 모든 비동기 작업이 완료 될 때 내 비디오 시리즈의 약속에 대해 기억하십시오 그렇지 않은 모든 클라우드 기능 HTTP 기능을 배경 기능이라고하며, 그리고 그들은 약속을 되찾아 야합니다 모든 비동기식 작업 후에 만 ​​이행되거나 거부됩니다 그 기능에서 시작된 것은 완료되었습니다

그것이이 TypeScript 정의입니다 우리에게 여기서 상기시켜줍니다 PromiseLike라는 객체 유형에 속지 마십시오 이것은 리턴 객체가 반드시 수행해야하는 인터페이스입니다 적절한 then catch 방식을 사용하십시오

정상적인 약속처럼 원하는 경우 VS 코드를 사용하여 클릭 할 수도 있습니다 아, 그리고 비동기 작업이 남아 있지 않으면 귀하의 처리기 기능에서 수행 할 수 있도록, 약속 대신 "null"을 반환 할 수 있습니다 그러나 그것은 나에게 오늘 사실이 될 수 없다 계속 해보자

그러면 그것이 어떻게 작동하는지 보게 될 것이다 OnCreate는 핸들러 함수를 인수로 취하고, 여기서 익명 함수를 사용하겠습니다 뚱뚱한 화살 구문으로 이것은 내 논리가 살아있는 곳입니다 우리가 보았 듯이, 핸들러 함수는 두 개의 인수를받습니다

데이터 스냅 샷 및 이벤트 컨텍스트 식별자 위로 마우스를 가져 가면, 당신은 그들의 유형을 생각 나게합니다 와일드 카드 값의 문자열 값을 알고 싶으면 경로에서 이벤트 컨텍스트 개체를 사용할 수 있습니다 eventparams 객체는 속성을 포함합니다

그 와일드 카드와 같은 이름으로, 그리고 그 값은 당신이 찾고있는 문자열이 될 것입니다 내가이 기능에서 정말로 필요로하지 않는다는 것을 알게된다 하지만 나는 어쨌든 그들의 가치를 기록 할 것이다 필요한 경우 디버깅에 도움이됩니다 이제 데이터베이스에서 데이터를 가져와 이 위치에 스냅 샷 객체가 추가되었습니다

저에게주는 val이라는 메소드가 있습니다 원시 데이터의 복사본을 JavaScript 객체로 저장합니다 이제 데이터베이스에서 메시지가 이와 같이 보임을 기억하십시오 스냅 샷에서받은 객체 이 속성들이 설정 될 것입니다 텍스트 속성은 내가 대체해야 할 것입니다

이모티콘이 포함 된 피자 단어 그래서 내가 할 일은 그 텍스트 값을 얻는 것입니다 스냅 샷 데이터에 피자를 추가하고, 같은 이름의 const에 할당하십시오 그렇다면 어떻게 피자를 추가 할 수 있습니까? 여기에 그 기능의 구현을 붙여 넣을 것입니다 그것이하는 일은 정규식을 사용하는 것입니다

전체 단어의 인스턴스에 대한 입력 문자열을 검사하는 방법 "피자"대신 각각 피자 그림 이모티로 바꿉니다 수정 된 문자열이 반환됩니다 피자 단어를 이모티콘으로 바꾸는 방법이 생겼으니, 수정 된 문자열을 데이터베이스에 다시 쓸 수 있습니다 스냅 샷의 ref 속성을 사용하면 쉽습니다 목적

ref 속성 위에 마우스를 올려 놓으면, VS 코드는 참조 유형 객체라고 알려줍니다 데이터베이스에 대한 관리자 액세스 권한이 있습니다 이 ref 속성에 대해 더 자세히 말하고 싶습니다 그것에 대해 알아야 할 두 가지 사항이 있습니다 첫째, 참조는 다른 데이터베이스와 매우 유사합니다

사용중인 참조 클라이언트 코드에서 또한 가리킨다 데이터베이스의 일부 위치로 이동합니다 여기 클라우드 기능에서 참조 패턴과 일치하는 위치를 가리킨다 함수 정의의 ref 메소드에 주어진다 이를 사용하여 해당 위치에서 데이터베이스를 읽고 쓸 수 있으며, 다른 위치에 대한 참조를 더 많이 만들 수 있습니다

둘째, 참조에는 관리자 권한이 있습니다 이는 데이터베이스에 대한 완전한 제어권을 가짐을 의미합니다 특히, 보안이 없음을 의미합니다 데이터베이스의 규칙이 영향을 미칩니다 읽기 또는 쓰기가이 참조를 사용하여 수행되는 방식

그러므로 코드를 작성할 때 명심하십시오 이제 메시지 텍스트에 피자를 추가 했으니 까 나는 그것을 다시 데이터베이스에 쓰고 싶다 스냅 샷 참조를 사용하여 호출 할 수 있습니다 그것의 업데이트 메소드와 자식 객체를 전달한다

나는 갱신하고 싶다 하지만 여기에 실종 된 것이 있습니다 업데이트는 비동기 메서드입니다 우리는 마우스를 메서드 위로 가져 가면 그 것을 볼 수 있습니다 업데이트는 약속을 반환하므로 내 함수 완료 될 때까지 기다릴 필요가 있습니다

약속을 마지막으로 돌려 주면됩니다 여기에서 할 이제 터미널로 전환하여 실행합니다 Firebase는 내 프로젝트 디렉토리의 기능 만 배포합니다 함수가 배포 된 후에는 내 대화 스크립트를 다시 실행 한 다음 Firebase 콘솔로 전환하십시오 그것을 실시간으로 볼 수 있습니다

그리고 피자 단어를 볼 수 있습니다 이모티콘으로 대체되었습니다 그런 pizzazz 내 대화방에는 더 많은 성격이 있습니다 그러나 나는 또한 방에있는 사람들을 허용하고 싶다

메시지를 보낸 후 편집 할 수 있습니다 OnCreate 트리거는 다음과 같은 경우에는 실행되지 않습니다 기존 데이터는 데이터베이스에서 변경됩니다 새로운 데이터가 추가 될 때 그래서 누군가가 그들의 메시지를 편집한다면, 이 특별 대우를받지 못합니다

당신이 그것을하는 방법을보고 싶다면, Firebase 채널에 바로 가입하십시오 YouTube에서 알림을받습니다 다음 비디오가 준비되면 그때까지 문서 및 코드에 대한 링크를 확인하십시오 샘플은 아래 설명에 나와 있습니다

다음에 또 보자 [음악 재생]