好的,所以我将从一些背景开始(跳到tl; dr的“我的问题”):

我有一个正在开发中的应用程序,它可以将数据从Google Sheet传递到二维数组形式的Firebase实时数据库中。 Google工作表的数据布局如下所示:
javascript - 通过Firebase Cloud函数提取特定的节点值-LMLPHP

该数据通过如下所示的Apps脚本函数结果传递到节点masterSheet下的Firebase实时数据库中:

javascript - 通过Firebase Cloud函数提取特定的节点值-LMLPHP

我正在使用Ionic Framework开发的移动网络应用程序用作实时数据库(下面的预览):

javascript - 通过Firebase Cloud函数提取特定的节点值-LMLPHP

我具有处理每个作业的子任务在正确位置的“ Y”和“ N”标志的设置的功能,以及当所有子任务完成工作时将整体作业完成状态标志设置为“ Y”的功能如预期。

我试图通过Firebase Cloud Functions添加自动电子邮件服务,每当作业的整体“已完成”状态设置为“ Y”时(即ref:'masterSheet / 0/1的值),该邮件就会发送“作业完成通知” '等于“ Y”)。

到目前为止,每当作业的整体完成状态从“ N”更改为“ N”时,我已经成功使用Nodemailer和Firebase Admin SDK通过Firebase Cloud Function将电子邮件成功发送给Firebase应用程序的所有注册用户。 Y”(通过onUpdate()方法和要监听的位置的.ref())。

以下是我的Index.js文件,其中包含我正在使用的云函数:



// The Cloud Functions for Firebase SDK to create Cloud Functions and setup triggers.
const functions = require('firebase-functions');

// The Firebase Admin SDK to access the Firebase Realtime Database.
const admin = require('firebase-admin');
admin.initializeApp();

// The mail service used
const nodemailer = require('nodemailer');

// Cloud Fucntion to export:
exports.onMessageUpdate = functions.database.ref('/masterSheet/{subArray}/1')
  .onUpdate((change) => {
    var changeRef = change.after.ref.path;
    console.log('changeRef: ' + changeRef);
    var newVal = change.after.val();
    if (newVal == "Y"){
      getUsers();
    }
  })

// Fucntion to get all registers users of the Firebase Project
function getUsers(){
  var userEmails = [];
  admin.auth().listUsers()
    .then(function(listUsersResult) {
      listUsersResult.users.forEach(function(userRecord) {
        console.log(userRecord);
        userEmails.push(userRecord.email);
        sendCompletionEmail(userRecord.email)
      });
    })
    .catch(function(error) {
      console.log("Error listing users:", error);
    });
}

// Function to send automatic emails
function sendCompletionEmail(email){
  var transporter = nodemailer.createTransport({
    service: 'gmail',
    auth: {
      type: 'OAuth2',
      user: 'xxxxxxxx@gmail.com',
      clientId: 'xxxxxxxx.apps.googleusercontent.com',
      clientSecret: 'xxxxxxxxxxxxxxx',
      refreshToken: 'xxxxxxxxxxxxxx'
    }
  })

  // Email details:
  var mailOptions = {
    from: 'xxxxxxx',
    to: email,
    subject: 'Job completion notification',
    text: 'This is an automated message to inform you that a job has been fully completed ' +
    'with all of its tasks marked as done. \n\nYou can view this (along with any others) from the Completed ' +
    'Jobs page within the app.'
  }

  transporter.sendMail(mailOptions, function (err, res) {
    if(err){
        console.log('Error');
    } else {
        console.log('Email Sent');
    }
  })
}





我的问题:
我希望能够在发送的此自动电子邮件中包含职位名称。

记录以下代码段中使用的change.after.ref.path的结果:



// Cloud Fucntion to export:
exports.onMessageUpdate = functions.database.ref('/masterSheet/{subArray}/1')
  .onUpdate((change) => {
    var changeRef = change.after.ref.path;
    console.log('changeRef: ' + changeRef);
    var newVal = change.after.val();
    if (newVal == "Y"){
      getUsers();
    }
  })





产生以下日志输出:

javascript - 通过Firebase Cloud函数提取特定的节点值-LMLPHP

它完全包含我想要的内容...但是我不知道如何将其发布...

如何从changeRef变量中检索第二个值,以便可以将其传递到sendCompletionEmail()函数上,并使用它来引用该节点在位置[0]处的项目?

就像是:



var subArray = changeRef[1]





获取值:masterSheet / 0/1中的0

我可以将其存储为变量,并用于在发送的电子邮件中引用刚刚完成的工作的工作标题。

谢谢你的帮助!

最佳答案

如果要在请求中查找0,则可以从传递给Cloud Function的第二个参数中获得该值(但您未声明)。

exports.onMessageUpdate = functions.database.ref('/masterSheet/{subArray}/1')
  .onUpdate((change, context) => {
      console.log(context.params.subArray);
  })


请参阅handling event data上的Firebase文档以及onUpdate的参考文档。

09-25 16:43
查看更多