Cloud Functions 최소(Firestore 트리거)

7568 단어 FirebaseFirestore
Firestore에서의 데이터의 생성, 변경, 삭제등을 트리거에 처리를 실행하는 firestore 트리거를 시험해 보고 싶습니다.
HTTP (요청에 의한) 트리거에 대해서는 여기

전제


  • Firebase를 이용하거나 Function을 작성하기 위한 환경이 갖추어져 있는 것.
  • 아직 분은 이쪽을 부디.


  • 구현



    최소한의 구현은 대략 아래와 같은 느낌일까.

    아래 예제에서는 firestore의 share라는 Collection의 params라는 문서에 대해 create, update, delete 중 하나가 실행되었음을 트리거로 처리(콘솔에 Hello Trigger!로 표시)를 실행합니다. .

    index.js
    const functions = require('firebase-functions');
    
    exports.helloTrigger = functions.firestore.document('share/params').onWrite((change, context) => {
        console.log("Hello Trigger!");
        return 0;
    });
    

    return 0; 을 넣고 있는 것은 Error: Value for argument "data"is not a valid Firestore document. 라고 하는 에러가 로그에 나오는 것을 막기 위해서입니다.

    실행 확인(디버그)



    실행



    실행은, 다른 프로그램등으로부터 db.collection('share').doc('params').set({color:'red'});등의 더미 커멘드 실행해, 트리거의 대상이 되고 있다 문서를 생성 (업데이트/삭제) 해보십시오.

    일일이 테스트를 위해 스크립트 쓰는 것도 번거롭기 때문에 나는 SQL Tabs라는 도구 와 사용해 데이터를 생성시키거나 , 갱신시키거나 하고 있습니다. 별로 복잡한 처리는 할 수 없어 불만도 있지만, 없는 것보다 낫습니다.

    console.log()의 출력을 어디에서 확인할까?



    HTTP 트리거의 경우, 출력에 에러를 포함하면 디버그할 수 있습니다만, Firestore 트리거의 경우, console.log()를 사용할 필요가 있습니다만, 물론 로컬 콘솔에 출력은 되지 않습니다. 코드의 console.log()는 Firebase 콘솔의 Functions 로그에서 확인할 수 있습니다.

    아래와 같은 느낌으로 출력을 확인할 수 있습니다.



    또한 return 0;을 넣지 않으면 아래와 같이 Error 로그가 출력됩니다.



    조금 응용



    나는 한 문서의 변경을 트리거에 다른 DB(RDB라든지)에 필요한 정보를 쓰는 것 같은 처리가 하고 싶다고 생각하고 있으므로, 그것을 의식한 코드를 써 보겠습니다. 그렇다고 해도, 무료로 사용하는 클라우드 SQL 서버가 없기 때문에, 우선 Firestore에 기입해 보겠습니다.
  • share/params의 변경을 기점으로, logs에 (로그풍의) 데이터를 기입하고 있습니다.
  • function이 전개되는 리전을 도쿄에 지정하고 있습니다.

  • index.js
    const functions = require('firebase-functions');
    const admin = require('firebase-admin');
    admin.initializeApp();
    
    const db = admin.firestore();
    
    exports.helloTrigger = functions.region('asia-northeast1').firestore.document('share/params').onWrite((change, context) => {
        db.collection('logs').add({
            param: 'hoge',
            after: change.after.data(),
            before: change.before.data(),
            created_at: admin.firestore.FieldValue.serverTimestamp(),
        });
        console.log("hoge");
        return 0;
    });
    

    와일드카드 사용



    와일드 카드가 지금 일어났는지 모르기 때문에 확인해 보았습니다.

    예를 들어, 다음과 같은 코드를 준비하고,
    exports.helloTrigger = functions.region('asia-northeast1').firestore.document('share/{doc_name}').onWrite((change, context) => {
        let doc_name = context.params.doc_name;
        console.log(doc_name);
        console.log(change.after.data());
        console.log(change.before.data());
        return 0;
    });
    
    db.collection('share').doc('params').set({});
    

    실행하면 params가 출력되고,
    db.collection('share').doc('configs').set({});
    

    실행하면 configs가 출력됩니다. 즉, db 조작시에 파라미터를 건네주면 그것을 function 측에서 취득할 수 있는 구조인 것 같습니다.

    어떤 컬렉션을 모니터링하고 어떤 문서에 어떤 처리가 되었습니까? 등을 알기에는 좋은 것일지도 모른다(반대로, 특정의 문서만을 관련하는 씬이 적은가···).

    지금 하나 이해가 부족하기 때문에 계속 탐구하는 것으로.

    좋은 웹페이지 즐겨찾기