已部署 nodemailer 的 Firebase 功能,但没有日志且无法与数据库正常工作

Ika*_*aki 2 node.js firebase nodemailer firebase-realtime-database google-cloud-functions

我已经使用 nodemailer 设置了一个 firebase-function 以从连接到我的联系表单的 firebase-database 获取输入并将其通过电子邮件发送到我的电子邮件。

我已成功部署该函数,并且可以在我的 firebase 控制台中看到该函数,但是我没有在控制台中收到任何错误,也没有在控制台的函数部分看到任何日志或信息。它现在根本不起作用。

这是我第一次这样做,我已经查看了几乎所有其他关于 SO 的类似问题,但他们都没有给我任何关于我做错了什么的线索。

这是我的函数 package.json:

{
  "name": "functions",
  "description": "Cloud Functions for Firebase",
  "scripts": {
    "lint": "eslint .",
    "serve": "firebase serve --only functions",
    "shell": "firebase functions:shell",
    "start": "npm run shell",
    "deploy": "firebase deploy --only functions",
    "logs": "firebase functions:log"
  },
  "engines": {
    "node": "8"
  },
  "dependencies": {
    "firebase-admin": "~7.0.0",
    "firebase-functions": "^2.3.0",
    "nodemailer": "^6.1.1"
  },
  "devDependencies": {
    "eslint-plugin-promise": "^4.0.1",
    "firebase-functions-test": "^0.1.6"
  },
  "private": true
}
Run Code Online (Sandbox Code Playgroud)

这是函数文件夹中的 index.js 代码:

const functions = require("firebase-functions");
const admin = require("firebase-admin");
const nodemailer = require("nodemailer");


const gmailEmail = "k****l@gmail.com";
const gmailPassword = functions.config().gmail.pass;

admin.initializeApp();


var goMail = function(message) {

  const transporter = nodemailer.createTransport({
    service: "gmail",
    auth: {
      user: gmailEmail,
      pass: gmailPassword
    }
  });


  const mailOptions = {
    from: gmailEmail, // sender address
    to: "****l@gmail.com", // list of receivers
    subject: "!", // Subject line
    text: "!" + message, // plain text body
    html: "!" + message // html body
  };


  const getDeliveryStatus = function(error, info) {
    if (error) {
      return console.log(error);
    }
    console.log("Message sent: %s", info.messageId);

  };


  transporter.sendMail(mailOptions, getDeliveryStatus);
};

exports.onDataAdded = functions.database
  .ref("/messages/{messageId}")
  .onCreate(function(snap, context) {

    const createdData = snap.val();
    var name = createdData.name;
    var email = createdData.email;
    var number = createdData.number;
    var message = createdData.message;


    goMail(name, email, number, message);
  });
Run Code Online (Sandbox Code Playgroud)

我不确定我的设置是否错误,或者我是否对 index.js 中的 nodemailer 代码做错了。

我在这里先向您的帮助表示感谢。

Ren*_*nec 5

正如评论中所解释的,由于您的 Cloud Function 是由后台事件触发的,您必须返回一个承诺以指示异步任务已完成。

所以在goMail函数中你应该返回sendMail()方法返回的承诺:

...
return transporter.sendMail(mailOptions);   //Remove the callback
Run Code Online (Sandbox Code Playgroud)

您应该在 Cloud Function 本身中返回该goMail函数返回的承诺:

return goMail(...) 
Run Code Online (Sandbox Code Playgroud)