部署后 Firebase 不发送电子邮件 + 无日志
Firebase doesn't send emails after deploying + no logs
我实现了下面的代码,当我 运行 它在本地机器上使用 npm start
时它工作得很好
但是,当我在 Firebase 上部署它时,sendOrderEmail 函数不起作用。
我什至没有得到任何日志。
const functions = require("firebase-functions");
const admin = require("firebase-admin");
const {email, password} = require('./config');
const nodemailer = require('nodemailer');
const htmlToText = require('nodemailer-html-to-text').htmlToText;
admin.initializeApp();
const mailTransport = nodemailer.createTransport({
service: 'gmail',
auth: {
user: email,
pass: password
}
});
mailTransport.use("compile", htmlToText());
const APP_NAME = 'the.Travelest';
exports.sendUserEmail = functions.database
.ref("/lettersRequest/{pushId}")
.onCreate(request => {
return sendOrderEmail(request.val().email);
});
async function sendOrderEmail(email){
const mailOptions = {
from: `${APP_NAME}`,
to: email,
subject: `Your order from ${APP_NAME}`,
html: `
<div>
<strong> Hello </strong>
World
</div>
`
};
return await mailTransport.sendMail(mailOptions);
}
更新
检查逻辑后,我相信我在另一个地方发现了问题。
因此,逻辑是 - 当我在表单中单击“提交”时,我将数据发送到 Firebase 运行时数据库。并且此操作会触发上述功能并发送电子邮件。
但是,提交按钮没有触发它应该触发的过程。当我点击 SUBMIT 时,我什至没有在控制台中看到 console.log
结果
同样,它在本地工作,当我 运行 nom start
这是提交处理程序:
const handleSubmit = event => {
event.preventDefault();
setErrors(validate(values))
setIsSubmitting(true)
try{
const newRequestRef = database.ref('lettersRequest').push();
const newRequest = {
country: values.country,
travelersAmount: values.travelersAmount,
introExtro: values.introExtro,
comments: values.comments,
email: values.email,
phone: values.phone
};
newRequestRef.set({
email: values.email,
request: newRequest
});
console.log("no error")
}catch(e){
console.log("error")
}
}
您没有处理 set()
返回的承诺。试试这个:
const handleSubmit = event => {
event.preventDefault();
setErrors(validate(values))
setIsSubmitting(true)
const newRequestRef = database.ref('lettersRequest').push();
const newRequest = {
country: values.country,
travelersAmount: values.travelersAmount,
introExtro: values.introExtro,
comments: values.comments,
email: values.email,
phone: values.phone
};
newRequestRef.set({
email: values.email,
request: newRequest
}).then(() => {
console.log("Request Added in Database")
}).catch(e => console.log(e));
}
如果它记录 'Request Added in Database' 那么它已经成功添加并且你的函数应该触发。
此外,这也可以通过 Callable Function 来完成,这意味着您可以直接从客户端调用该函数,进行所有验证,将数据添加到数据库中并发送电子邮件,而不是使用数据库触发器。
所以,这个问题比我预想的还要微不足道:D
我确实部署到 firebase,但我从来没有提交和构建项目......
因此,每次部署后都没有更新任何内容。
愚蠢的错误
我实现了下面的代码,当我 运行 它在本地机器上使用 npm start
但是,当我在 Firebase 上部署它时,sendOrderEmail 函数不起作用。
我什至没有得到任何日志。
const functions = require("firebase-functions");
const admin = require("firebase-admin");
const {email, password} = require('./config');
const nodemailer = require('nodemailer');
const htmlToText = require('nodemailer-html-to-text').htmlToText;
admin.initializeApp();
const mailTransport = nodemailer.createTransport({
service: 'gmail',
auth: {
user: email,
pass: password
}
});
mailTransport.use("compile", htmlToText());
const APP_NAME = 'the.Travelest';
exports.sendUserEmail = functions.database
.ref("/lettersRequest/{pushId}")
.onCreate(request => {
return sendOrderEmail(request.val().email);
});
async function sendOrderEmail(email){
const mailOptions = {
from: `${APP_NAME}`,
to: email,
subject: `Your order from ${APP_NAME}`,
html: `
<div>
<strong> Hello </strong>
World
</div>
`
};
return await mailTransport.sendMail(mailOptions);
}
更新 检查逻辑后,我相信我在另一个地方发现了问题。
因此,逻辑是 - 当我在表单中单击“提交”时,我将数据发送到 Firebase 运行时数据库。并且此操作会触发上述功能并发送电子邮件。
但是,提交按钮没有触发它应该触发的过程。当我点击 SUBMIT 时,我什至没有在控制台中看到 console.log
结果
同样,它在本地工作,当我 运行 nom start
这是提交处理程序:
const handleSubmit = event => {
event.preventDefault();
setErrors(validate(values))
setIsSubmitting(true)
try{
const newRequestRef = database.ref('lettersRequest').push();
const newRequest = {
country: values.country,
travelersAmount: values.travelersAmount,
introExtro: values.introExtro,
comments: values.comments,
email: values.email,
phone: values.phone
};
newRequestRef.set({
email: values.email,
request: newRequest
});
console.log("no error")
}catch(e){
console.log("error")
}
}
您没有处理 set()
返回的承诺。试试这个:
const handleSubmit = event => {
event.preventDefault();
setErrors(validate(values))
setIsSubmitting(true)
const newRequestRef = database.ref('lettersRequest').push();
const newRequest = {
country: values.country,
travelersAmount: values.travelersAmount,
introExtro: values.introExtro,
comments: values.comments,
email: values.email,
phone: values.phone
};
newRequestRef.set({
email: values.email,
request: newRequest
}).then(() => {
console.log("Request Added in Database")
}).catch(e => console.log(e));
}
如果它记录 'Request Added in Database' 那么它已经成功添加并且你的函数应该触发。
此外,这也可以通过 Callable Function 来完成,这意味着您可以直接从客户端调用该函数,进行所有验证,将数据添加到数据库中并发送电子邮件,而不是使用数据库触发器。
所以,这个问题比我预想的还要微不足道:D 我确实部署到 firebase,但我从来没有提交和构建项目...... 因此,每次部署后都没有更新任何内容。
愚蠢的错误