【问题标题】:Firebase cloud function ends before email is sentFirebase 云功能在发送电子邮件之前结束
【发布时间】:2018-02-26 14:13:00
【问题描述】:

显然下面的代码可以正常工作,但是触发函数的执行在电子邮件发送之前很久就结束了。 不知道会不会出错。

在发送电子邮件之前延迟结束的正确方法是什么?

const mailTransport = nodemailer.createTransport({
    service: "gmail",
    auth: {
        user: "email",
        pass: "pass"
      }
});

exports.createEnrollment = functions.firestore
    .document("enrollments/{enrollmentId}")
    .onCreate(event => {

        var newValue = event.data.data();

        // ... other commands to retrieve email content and recipient

         mailTransport
          .sendMail(content)
          .then(() => {
            console.log(`New email sent to ${email}`);
          })
          .catch(function(error) {
            console.error("Error writing document: ", error);
          });

     console.log("ending function");
     return event.data.data();

});

【问题讨论】:

  • console.logs 出现了吗?
  • 它们出现在云功能日志中。但日志也会通知函数何时结束。

标签: javascript firebase google-cloud-functions google-cloud-firestore


【解决方案1】:

你在你的承诺解决之前就回来了。

const mailTransport = nodemailer.createTransport({
  service: "gmail",
  auth: {
    user: "email",
    pass: "pass"
  }
});

exports.createEnrollment = functions.firestore
  .document("enrollments/{enrollmentId}")
  .onCreate(event => {

    var newValue = event.data.data();    

    // ... other commands to retrieve email content and recipient

    return mailTransport
      .sendMail(content)
      .then(() => {
        console.log(`New email sent to ${email}`);
      })
      .catch(function (error) {
        console.error("Error writing document: ", error);
      });
    console.log("ending function");
  });

mailtransport.sendMail 是一个应返回的承诺。

但是现在你永远不会在你的日志中看到结束函数。如果你愿意的话。在你的 .then 函数中移动它,或者链接另一个。

【讨论】:

  • 但是,由于它是一个firestore触发器,我认为它应该返回一个修改原始值的值或promise。不是吗?
  • 您返回一个仅在函数中的所有异步工作完成后才解决的promise。工作是什么并不重要,但承诺必须代表所有工作。
猜你喜欢
  • 2018-11-15
  • 2017-12-03
  • 2020-11-22
  • 2018-12-19
  • 2018-10-16
  • 2021-06-18
  • 1970-01-01
  • 1970-01-01
  • 2019-04-20
相关资源
最近更新 更多