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