Firebase - облачная функция возвращает неопределенное - PullRequest
0 голосов
/ 09 октября 2018

Я пытаюсь создать функцию почтовой программы, используя преимущества облачных функций nodemailer и firebase:

const functions = require('firebase-functions');
const nodemailer = require('nodemailer');

const gmailEmail = functions.config().gmail.email;
const gmailPassword = functions.config().gmail.password;
const mailTransport = nodemailer.createTransport("smtps://gmailEmail:gmailPassword@smtp.gmail.com");

const test = 'some.email@gmail.com'

const APP_NAME = 'Dati fatturazione elettronica';

exports.sendDatas = functions.database.ref('/datiFatt/{pushId}').onCreate((data) => {
  console.log(data);

  const name = data.name;
  const pec = data.pec
  const id = data.id;

  return sendEmail(name, pec, id);
});

function sendEmail(name, pec, id) {
  const mailOptions = {
    from: `${gmailEmail}`,
    to: test
  };

  mailOptions.subject = `Data from ${name}!`;
  mailOptions.html = `${name} \n ${pec} \n ${id} `;

  return mailTransport.sendMail(mailOptions)
    .then(() => {
      return console.log('New email sent to:', test);
    });
}

Но почему-то эта функция возвращает 'undefined' во всех своих полях.Возможно, я неправильно обращаюсь к данным.

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

В вашем коде есть два места, которые вы должны исправить:

Во-первых , поскольку кажется, что вы используете старую версию Firebase SDK для облачных функций (т. Е. https://firebase.google.com/docs/functions/beta-v1-diff#realtime-database), вы получите данные, которые были только что добавлены в базу данных, используя val() метод DataSnapshot (data.data в вашем случае), следующим образом:

exports.sendDatas = functions.database.ref('/datiFatt/{pushId}').onCreate((data) => {
  const name = data.data.val().name;
  const pec = data.data.val().pec
  const id = data.data.val().id;
  ....
});

Обратите внимание, что было бы более понятным назвать параметр функции обратного вызова как event вместо data и изменить код следующим образом:

exports.sendDatas = functions.database.ref('/datiFatt/{pushId}').onCreate((event) => {
  const name = event.data.val().name;
  ....
});

Тем не менее, я бы посоветовал вам выполнить обновление до последней версии SDK и, следовательно, использовать последний синтаксис (....onCreate((snap, context) => {const name = snap.val().name; ....}); см. doc , упомянутый выше).

Во-вторых, для облачных функций, запускаемых событиями в базе данных реального времени (как и другие фоновые функции), вы должны вернуть Promise, чтобы указать платформе, когда функция будет завершена (или сгенерировала ошибку). Поэтому вам следует изменить свою функцию какследует:

function sendEmail(name, pec, id) {
  const mailOptions = {
    from: `${gmailEmail}`,
    to: test
  };
  mailOptions.subject = `Data from ${name}!`;
  mailOptions.html = `${name} \n ${pec} \n ${id} `;
  return mailTransport.sendMail(mailOptions);
 });
}
0 голосов
/ 09 октября 2018

Ваша sendEmail функция может быть неправильной.Вы пытаетесь return console.log.

Попробуйте настроить на следующий формат;

function sendEmail(name, pec, id) {
  const mailOptions = {
    from: `${gmailEmail}`,
    to: test
  };

  mailOptions.subject = `Data from ${name}!`;
  mailOptions.html = `${name} \n ${pec} \n ${id} `;

  return mailTransport.sendMail(mailOptions)
    .then(() => {
      console.log('New email sent to:', test);

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