Firebase 佇列和工作人員
你可以將任務或資料推送到 firebase 實時資料庫並執行一個偵聽 firebase 佇列的 worker 來執行一些後臺處理
設定 firebase
-
如果你還沒有 Firebase 專案,請在 Firebase 控制檯中建立 Firebase 專案。如果你已有與你的應用相關聯的現有 Google 專案,請點選匯入 Google Project。否則,單擊建立新專案。
-
單擊設定圖示,然後選擇許可權。
-
從左側選單中選擇服務帳戶。
-
單擊建立服務帳戶。
輸入服務帳戶的名稱。
你可以選擇自定義從名稱自動生成的 ID。
從 Role 下拉選單中選擇 Project> Editor。
選擇提供新的私鑰,並將金鑰型別保留為 JSON。
不選擇啟用 Google Apps 域範圍的委派。
單擊建立
-
建立服務帳戶時,將為你下載包含服務帳戶憑據的 JSON 檔案。你需要這個來初始化伺服器中的 SDK。
設定伺服器
在 nodejs app 中使用 npm 安裝 firebase-queue
npm install firebase firebase-queue --save
一旦安裝了 firebase 和 firebase-queue,就可以開始建立新的 Queue 並將其傳遞給 Firebase 引用和處理函式。
現在,我們可以在建立新使用者時從應用程式建立一個 firebase 佇列任務,並將 worker 設定為偵聽 firebase-queue 任務並向建立的使用者郵件傳送電子郵件。
* server.js
var app=express();
var Queue = require('firebase-queue'),
Firebase = require('firebase');
更新 Firebase 專案憑據和 Firebase 資料庫 URL
var firebase = Firebase.initializeApp({
serviceAccount: "path/to/serviceAccountCredentials.json",
databaseURL: "https://databaseName.firebaseio.com"
});
或者你可以直接輸入 firebase 憑據,如下所示
var firebase = Firebase.initializeApp({
serviceAccount: {
projectId: "projectId",
clientEmail: "foo@projectId.iam.gserviceaccount.com",
privateKey: "-----BEGIN PRIVATE KEY-----\nkey\n-----END PRIVATE KEY-----\n"
},
databaseURL: "https://databaseName.firebaseio.com"
});
var refQueue = firebase.database().ref("queue/tasks");
createUser = funtion(email, password){
var user = {
username: email,
password: password
};
user = new db.users(user);
user.save(function(err, user){
if(!err){
refQueue.push({case: "NEW_USER", data: user});
}
})
}
createUser("abc@abc.com", "password");
* worker.js
var Queue = require('firebase-queue'),
Firebase = require('firebase');
//Update your Firebase Project Credentials and Firebase Database URL by one of the way specified in server.js
var firebase = Firebase.initializeApp({
serviceAccount: "path/to/serviceAccountCredentials.json",
databaseURL: "https://databaseName.firebaseio.com"
});
var refQueue = firebase.database().ref("queue");
var queue = new Queue(refQueue, function(data, progress, resolve, reject) {
switch(data.case){
case "NEW_USER":
sendMail(data.data.email);
console.log("user created");
//sendMail function is not an inbuilt function and will not work unless you define and implement the function
break;
// Finish the task asynchronously
setTimeout(function() {
resolve();
}, 1000);
});
單獨執行伺服器和工作程式並使用 firebase 佇列進行測試
node server.js
node worker.js