Firebase Cloud Functions with Database and Messaging

Cloud Functions

Firebase 一直以來便是以 serverless 為主要的方向, 而 Functions 則是一個十分有趣的功能; 它可以自動地隨著事件的回應,如資料庫的異動或是收到 HTTP 的 requests 時,執行程式碼。 其中一個重點是,我們也不需要去管理或是 scale 伺服器。

Triggers

  • Cloud Firestore Triggers
  • Realtime Database Triggers
  • Firebase Authentication Triggers
  • Google Analytics for Firebase Triggers
  • Crashlytics Triggers
  • Cloud Storage Triggers
  • Cloud Pub/Sub Triggers
  • HTTP Triggers

範例

需求

Realtime Database 底下的資料有異動的話,進行推播

直接上 Code

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
exports.updateTodayNews = functions.database.ref('/today/{newsCategory}/updatedTime').onWrite(event => {
    const newsCategory = event.params.newsCategory;
    return admin.database().ref(`/today/${newsCategory}`).once('value').then((snapshot) => {
        if (!snapshot.hasChildren()) {
            return console.log('There are no notification tokens to send to.');
        }
        const title = snapshot.child('title').val();
        const body = snapshot.child('body').val();
        // Notification details.
        const payload = {
          notification: {
            title: title,
            body: body
          }
        };
        if (!snapshot.child('fcmTokens').hasChildren()) {
            return console.log('There are no notification tokens to send to.');
        }
        const tokens = Object.keys(snapshot.child('fcmTokens').val());
        const pushTokens = tokens.filter(key => {
            return snapshot.child('fcmTokens').child(key).val();
        });
        return admin.messaging().sendToDevice(pushTokens, payload)
        .then(function (response) {
            console.log('successfully sent message:', response);
        })
        .catch(function (error) {
            console.log('Error sending message:', error);
        });
    });
});

簡單解說

exports 後面加上這支 function 的名稱,如我們這邊則為 updateTodayNews, 而 {newsCategory} 則是變數,以範例來說: 只要 /today/ 底下的任何物件 /updatedTime 又被寫入的話,則會觸發 function。 宣告 admin 是為了使用 Firebase 其他的功能,如這邊是使用到 messaging 和 database。

當 admin.database 得到資料回來後,再使用 admin.messaging().sendToDevice 來進行推播的發送。

comments powered by Disqus