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

Ваша функция 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);
});
}