Firebase 队列和工作人员

你可以将任务或数据推送到 firebase 实时数据库并运行一个侦听 firebase 队列的 worker 来运行一些后台处理

设置 firebase

  1. 如果你还没有 Firebase 项目,请在 Firebase 控制台中创建 Firebase 项目。如果你已有与你的应用相关联的现有 Google 项目,请点击导入 Google Project。否则,单击创建新项目

  2. 单击设置图标,然后选择权限。

  3. 从左侧菜单中选择服务帐户。

  4. 单击创建服务帐户。

    输入服务帐户的名称。

    你可以选择自定义从名称自动生成的 ID。

    从 Role 下拉列表中选择 Project> Editor。

    选择提供新的私钥,并将密钥类型保留为 JSON。

    不选择启用 Google Apps 域范围的委派。

    单击创建

  5. 创建服务帐户时,将为你下载包含服务帐户凭据的 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