Извлечь определенное значение узла с помощью функций Firebase Cloud - PullRequest
0 голосов
/ 20 февраля 2019

Хорошо, поэтому я собираюсь начать с некоторой предыстории (перейдите к МОЙ ПРОБЛЕМЕ для tl; dr):

У меня есть приложение в разработке, которое передает данные из Google Sheet в базу данных Firebase Realtime вформа 2-го массива.Структура данных листа Google показана ниже: Data in the Google Sheet

Эти данные передаются в базу данных Firebase Realtime в узле masterSheet через скрипт приложенияРезультат функции показан ниже:

Data in the Firebase Realtime Database

, который используется в качестве оперативной базы данных для моего мобильного веб-приложения, которое я разрабатываю с использованием Ionic Framework (предварительный просмотр ниже):

Data as viewed on the Ionic App

У меня есть функции, которые имеют дело с установкой флагов «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 console log

, который содержит именно то, что я хочу в нем... Но я не знаю, как его получить ...

Как я могу получить второе значение из переменной changeRef , чтобы я мог передать это в Функция sendCompletionEmail () и использовать ее для ссылки на элемент в позиции [0] для этого узла?

что-то вроде:

var subArray = changeRef[1]

, чтобы получить значение: 0 из masterSheet / 0/1

, которое я могу сохранить как переменную и использовать для ссылки на название должностиработа, которая была только что завершена в отправленном электронном письме.

Спасибо за любую помощь!

1 Ответ

0 голосов
/ 20 февраля 2019

Если вы ищете 0 из запроса, это доступно из второго параметра, который передается в вашу облачную функцию (но вы не объявляете).

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

См. Документацию Firebase по обработке данных о событиях и справочные документы по onUpdate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...