Firebase - облачная функция возвращает undefined

Я пытаюсь создать функцию почтовой программы, используя облачные функции 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:[email protected]");

const test = '[email protected]'

const APP_NAME = 'Dati fatturazione elettronica';

exports.sendDatas = functions.database.ref('/datiFatt/{pushId}').onCreate((data) => {
  console.info(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.info('New email sent to:', test);
    });
}

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

Интеграция Angular - Firebase Analytics
Интеграция Angular - Firebase Analytics
Узнайте, как настроить Firebase Analytics и отслеживать поведение пользователей в вашем приложении Angular.
0
0
382
2

Ответы 2

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

Попробуйте настроить формат, указанный ниже;

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.info('New email sent to:', test);

      return;
    });
}

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

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

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; ....}); см. док, упомянутый выше).

во-вторых, для облачных функций, запускаемых событиями в базе данных реального времени (как и другие фоновые функции), вы должны вернуть 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);
 });
}

Другие вопросы по теме