【问题标题】:Firebase - cloud function returns undefinedFirebase - 云函数返回未定义
【发布时间】:2018-10-09 10:35:20
【问题描述】:

我正在尝试利用 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:gmailPassword@smtp.gmail.com");

const test = 'some.email@gmail.com'

const APP_NAME = 'Dati fatturazione elettronica';

exports.sendDatas = functions.database.ref('/datiFatt/{pushId}').onCreate((data) => {
  console.log(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.log('New email sent to:', test);
    });
}

但不知何故,这个函数在其所有字段中都返回“未定义”。 可能我以错误的方式访问数据。

【问题讨论】:

    标签: firebase firebase-realtime-database google-cloud-functions


    【解决方案1】:

    您的sendEmail 函数可能有误。你正在尝试return console.log

    尝试调整为以下格式;

    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.log('New email sent to:', test);
    
          return;
        });
    }
    

    【讨论】:

      【解决方案2】:

      您的代码中有两个地方需要更正:

      首先,因为您似乎使用的是旧版本的 Firebase SDK for Cloud Functions(即 https://firebase.google.com/docs/functions/beta-v1-diff#realtime-database),您将获得刚刚添加到数据库中的数据通过使用DataSnapshot(在您的情况下为data.data)的val() 方法,如下所示:

      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; ....}); 参见上面引用的doc)。

      其次,对于由实时数据库中的事件触发的云函数(与其他后台函数一样),您必须返回一个 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);
       });
      }
      

      【讨论】:

        猜你喜欢
        • 2018-03-28
        • 1970-01-01
        • 1970-01-01
        • 2018-06-12
        • 2019-08-06
        • 2021-08-15
        • 1970-01-01
        • 2018-12-03
        • 2019-11-03
        相关资源
        最近更新 更多