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