我在同一个index.js文件中创建了几个函数,即 sendEmail
, sendEmailByDbStatusChange
和 sendEmailConfirmation
.
sendEmail
- 通过HTTP / API进行呼叫
sendEmailByDbStatusChange
- 在值更改时侦听DB,但操作是硬编码的
sendEmailConfirmation
- 在值更改时列出到DB,该操作受快照影响 .
以下是我的代码:
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({
service: 'gmail',
auth: {
user: gmailEmail,
pass: gmailPassword,
},
});
// Sends an email confirmation when a user changes his mailing list subscription.
exports.sendEmail = functions.https.onRequest((req, res) => {
if (req.body.subject === undefined || req.body.recipient === undefined) {
// This is an error case, as "message" is required.
//res.status(400).send('subject/body/recipient is missing!');
return false
} else {
const mailSubject = req.body.subject;
const mailHtmlBody = req.body.htmlBody;
const mailRecipient = req.body.recipient;
const mailOptions = {
from: '"Food Ninja." <foodninjaapp@gmail.com>',
to: mailRecipient,
subject: mailSubject,
html: mailHtmlBody
};
//res.status(200).send('Success: ' + mailSubject + ' to ' + mailRecipient);
return mailTransport.sendMail(mailOptions)
.then(() => {
console.log(`${mailSubject}subscription confirmation email sent to: `, mailRecipient)
return res.status(200).send('Success: ' + mailSubject + ' to ' + mailRecipient)
})
.catch((error) => console.error('There was an error while sending the email:', error));
}
});
exports.sendEmailByDbStatusChange = functions.database.ref('/users/{uid}').onWrite((event) => {
//const snapshot = event.data;
//const val = snapshot.val();
//if (!snapshot.changed('subscribedToMailingList')) {
// return null;
//}
const mailSubject = 'Sending email with Cloud Function - by DB onWrite Trigger';
const mailHtmlBody = '<h1>Hello Jerry</h1><p>If you receiving this means that you have successfully deployed a customized firebase function</p><p>Be Happy!<br><br>Food Ninja Team</p>';
const mailRecipient = 'admin@phd.com.my';
const mailOptions = {
from: '"Food Ninja." <foodninjaapp@gmail.com>',
to: mailRecipient,
subject: mailSubject,
html: mailHtmlBody
};
//const subscribed = val.subscribedToMailingList;
// Building Email message.
//mailOptions.subject = subscribed ? 'Thanks and Welcome!' : 'Sad to see you go :`(';
//mailOptions.text = subscribed ? 'Thanks you for subscribing to our newsletter. You will receive our next weekly newsletter.' : 'I hereby confirm that I will stop sending you the newsletter.';
return mailTransport.sendMail(mailOptions)
.then(() =>
console.log(`${mailSubject}subscription confirmation email sent to: `, mailRecipient)
//return res.status(200).send('Success: ' + mailSubject + ' to ' + mailRecipient)
)
.catch((error) => console.error('There was an error while sending the email:', error));
});
exports.sendEmailConfirmation = functions.database.ref('/users/{uid}').onWrite((event2) => {
console.log(event2)
console.log(event2.val())
console.log(event2.val().data)
console.log(event2.data)
console.log(event2.data.val())
const snapshot = event2.data;
console.log(snapshot)
const val = snapshot.val();
console.log(val)
if (!snapshot.changed('subscribedToMailingList')) {
return null;
}
const mailOptions = {
from: '"Spammy Corp." <noreply@firebase.com>',
to: val.email,
};
const subscribed = val.subscribedToMailingList;
// Building Email message.
mailOptions.subject = subscribed ? 'Thanks and Welcome!' : 'Sad to see you go :`(';
mailOptions.text = subscribed ? 'Thanks you for subscribing to our newsletter. You will receive our next weekly newsletter.' : 'I hereby confirm that I will stop sending you the newsletter.';
return mailTransport.sendMail(mailOptions)
.then(() => console.log(`New ${subscribed ? '' : 'un'}subscription confirmation email sent to:`, val.email))
.catch((error) => console.error('There was an error while sending the email:', error));
});
我的问题是,在我将代码部署到firebase函数后,控制台显示 sendEmailConfirmation
由于 event2.val
而无法顺利执行不是函数 .
我当前的代码结合了我的自定义代码和原始代码, sendEmailConfirmation
是原始代码 . 当独立运行原始代码时,它确实有效(原始版本为 event
而不是 event2
用于快照) .
请指教 .
2 回答
您似乎已更新到Firebase SDK for Cloud Functions的v1.0,但未升级您的代码以匹配 .
整个过程在this documentation page中解释 . 现在你被changes in database triggers击中,这表明:
根据这个例子,你需要这些东西:
从firebase-functions模块的1.0.0版开始,数据库onWrite事件现在提供Change对象而不是DataSnapshot对象作为第一个参数 . 您可以在documentation中阅读1.0.0中的所有重大更改 . 您应该使用此更改对象来选择是否要在调用它的更改之前或之后检查数据库的内容 .