Javascript 通过Firebase云函数提取特定节点值

Javascript 通过Firebase云函数提取特定节点值,javascript,firebase,firebase-realtime-database,google-cloud-functions,Javascript,Firebase,Firebase Realtime Database,Google Cloud Functions,好的,我将从一些背景开始(跳到我的tl;dr问题): 我有一个正在开发的应用程序,它以2d数组的形式将数据从Google工作表传递到Firebase实时数据库。Google工作表的数据布局如下所示: 该数据通过如下所示的应用程序脚本函数结果传递到节点母版下的Firebase实时数据库: 它用作我正在使用Ionic框架开发的移动web应用程序的实时数据库(预览如下): 我有一个函数,用于在每个作业的子任务的正确位置设置“Y”和“N”标志,还有一个函数,用于在所有子任务按预期完成时,将总体作业

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

我有一个正在开发的应用程序,它以2d数组的形式将数据从Google工作表传递到Firebase实时数据库。Google工作表的数据布局如下所示:

该数据通过如下所示的应用程序脚本函数结果传递到节点母版下的Firebase实时数据库:

它用作我正在使用Ionic框架开发的移动web应用程序的实时数据库(预览如下):

我有一个函数,用于在每个作业的子任务的正确位置设置“Y”和“N”标志,还有一个函数,用于在所有子任务按预期完成时,将总体作业完成状态标志设置为“Y”

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

到目前为止,我已经成功地让它通过Firebase云函数使用NodeEmailer和Firebase Admin SDK向Firebase应用程序的所有注册用户发送电子邮件,只要作业的整体完成状态通过onUpdate()方法和要侦听位置的.ref()从“N”更改为“Y”

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

//Firebase SDK的云函数用于创建云函数和设置触发器。
const functions=require('firebase-functions');
//使用Firebase管理SDK访问Firebase实时数据库。
const admin=require('firebase-admin');
admin.initializeApp();
//使用的邮件服务
const nodemailer=require('nodemailer');
//要导出的云功能:
exports.onMessageUpdate=functions.database.ref('/masterSheet/{subArray}/1')
.onUpdate((更改)=>{
var changeRef=change.after.ref.path;
console.log('changeRef:'+changeRef);
var newVal=change.after.val();
如果(新值=“Y”){
getUsers();
}
})
//获取Firebase项目所有注册用户的功能
函数getUsers(){
var userEmails=[];
admin.auth().listUsers()
.then(函数(listUsersResult){
listUsersResult.users.forEach(函数(userRecord){
console.log(userRecord);
userEmails.push(userRecord.email);
sendCompletionEmail(userRecord.email)
});
})
.catch(函数(错误){
log(“列出用户的错误:”,错误);
});
}
//功能发送自动电子邮件
函数sendCompletionEmail(电子邮件){
var transporter=nodeEmailer.createTransport({
服务:“gmail”,
认证:{
类型:“OAuth2”,
用户:'xxxxxxxx@gmail.com',
clientId:'xxxxxxxx.apps.googleusercontent.com',
客户机密:“XXXXXXXXXXXXX”,
refreshToken:'XXXXXXXXXXXXX'
}
})
//电邮详情:
var mailpoptions={
发件人:'xxxxxxx',
致:电邮:,
主题:“作业完成通知”,
text:“这是一条自动消息,通知您作业已完全完成”+
'其所有任务都标记为已完成。\n\n您可以从“已完成”窗口查看此任务(以及任何其他任务)'+
“应用程序中的作业页面。”
}
transporter.sendMail(邮件选项,函数(err,res){
如果(错误){
console.log('Error');
}否则{
console.log(“已发送电子邮件”);
}
})

}
如果您正在从请求中查找
0
,则可以从传递到云函数的第二个参数(但您没有声明)中找到该参数


如果要从请求中查找
0
,请参阅上的Firebase文档和参考文档。

,该请求可从传递到云函数的第二个参数中获得(但您没有声明)

有关详细信息,请参阅上的Firebase文档和参考文档

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