Хорошо, поэтому я собираюсь начать с некоторой предыстории (перейдите к МОЙ ПРОБЛЕМЕ для tl; dr):
У меня есть приложение в разработке, которое передает данные из Google Sheet в базу данных Firebase Realtime вформа 2-го массива.Структура данных листа Google показана ниже:
Эти данные передаются в базу данных Firebase Realtime в узле masterSheet через скрипт приложенияРезультат функции показан ниже:
, который используется в качестве оперативной базы данных для моего мобильного веб-приложения, которое я разрабатываю с использованием Ionic Framework (предварительный просмотр ниже):
У меня есть функции, которые имеют дело с установкой флагов «Y» и «N» в правильных положениях для подзадач каждого задания ифункция, которая устанавливает флаг состояния полного завершения задания на «Y», когда все подзадачи выполнены, как задумано.
Я пытаюсь добавить автоматический почтовый сервис через Firebase Cloud Functions, который отправляет «задание»уведомление о завершении «всякий раз, когда общий статус« Выполнено »задания устанавливается на« Y »(т. е. значение по умолчанию:« masterSheet / 0/1 »равно« Y »).
Пока мне удалосьчтобы заставить его успешно отправитьсообщения электронной почты через облачную функцию Firebase с использованием nodemailer и Firebase Admin SDK всем зарегистрированным пользователям приложения Firebase при каждом изменении общего завершенного статуса задания с «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');
}
})
}
МОЙ ВОПРОС: Я хочу иметь возможность включить название вакансии в это автоматическое электронное письмо, которое отправляется.
регистрация результатов изменения .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 из masterSheet / 0/1
, которое я могу сохранить как переменную и использовать для ссылки на название должностиработа, которая была только что завершена в отправленном электронном письме.
Спасибо за любую помощь!