javascript - 通过 Firebase Cloud 函数提取特定节点值
问题描述
好的,所以我将从一些背景开始(跳到 MY ISSUE for tl;dr):
我有一个正在开发的应用程序,它以二维数组的形式将数据从 Google 表格传递到 Firebase 实时数据库。Google sheet的数据布局如下图:
该数据通过如下所示的 Apps Script 函数结果传递到节点masterSheet下的 Firebase 实时数据库:
它用作我正在使用 Ionic Framework 开发的移动 Web 应用程序的实时数据库(预览如下):
我有处理在每个作业的子任务的正确位置设置“Y”和“N”标志的功能,以及在所有子任务完成时将整体作业完成状态标志设置为“Y”的功能如预期。
我正在尝试通过 Firebase Cloud Functions 添加自动电子邮件服务,每当作业的整体“已完成”状态设置为“Y”(即参考值:'masterSheet/0/1 ' 等于 "Y")。
到目前为止,每当作业的整体完成状态从“N”更改为“ 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();
}
})
生成此日志输出:
其中包含我想要的内容...但我不知道如何将其取出...
如何从changeRef变量中检索第二个值,以便将其传递给sendCompletionEmail()函数并使用它来引用该节点位置 [0] 处的项目?
就像是:
var subArray = changeRef[1]
获取值:0 out of masterSheet/0/1
我可以将其存储为变量并用于引用已发送电子邮件中刚刚完成的工作的职位。
谢谢你的帮助!
解决方案
推荐阅读
- powershell - Powershell命令/脚本根据日期将文件移动到子目录(在文件名的前8个字符中)
- yaml - 错误应连接以下节点但未连接:* /move_base->/move_base
- python - 使用两个 Python 数据框汇总数据
- php - 如何简化 Laravel 查询以按年搜索日期并按月分组
- django - For循环变量在Django模板中的if条件下不起作用
- unix - 用 vi 关闭后不在终端中保留文件的视图
- c# - Acumatica - 是否可以在图形类中为 API 调用定义“自定义键”?
- rabbitmq - KEDA - RabbitMQ 自动缩放器在收到少量消息时速度变慢
- server - /bin/python:没有名为 typing 的模块;'pip' 是一个包,不能直接执行
- android - 哪个安卓模拟器适合测试第三方服务的负载?