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 來進行推播的發送。

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s