部署后 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,但我从来没有提交和构建项目...... 因此,每次部署后都没有更新任何内容。

愚蠢的错误