已部署 nodemailer 的 Firebase 功能但没有日志并且无法与数据库正常工作
Firebase function for nodemailer deployed but no logs and not working correctly with database
我已经用 nodemailer 设置了一个 firebase 函数来获取我的输入
firebase-database 连接到我的联系表并将其通过电子邮件发送到我的电子邮件。
我已成功部署该函数,并且可以在我的 firebase 控制台中看到该函数,但是我没有在控制台中收到任何错误,也没有在控制台的函数部分中看到任何日志或信息。而且它现在根本不起作用。
这是我第一次这样做,我已经查看了关于 SO 的几乎所有其他类似问题,但其中 none 为我提供了关于我做错了什么的任何线索。
这是我的功能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
}
这是函数文件夹中的 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);
});
我不确定我的设置是否有误,或者我是否对 index.js 中的 nodemailer 代码做错了什么。
提前感谢您的帮助。
如评论中所述,由于您的 Cloud Function 是由后台事件触发的,因此您必须 return 承诺以指示异步任务已完成。
因此,在 goMail
函数中,您应该 return 通过 sendMail()
方法使用 return 承诺 return:
...
return transporter.sendMail(mailOptions); //Remove the callback
并且您应该 return,在 Cloud Function 本身中,return 由 goMail
函数编辑的承诺:
return goMail(...)
我已经用 nodemailer 设置了一个 firebase 函数来获取我的输入 firebase-database 连接到我的联系表并将其通过电子邮件发送到我的电子邮件。
我已成功部署该函数,并且可以在我的 firebase 控制台中看到该函数,但是我没有在控制台中收到任何错误,也没有在控制台的函数部分中看到任何日志或信息。而且它现在根本不起作用。
这是我第一次这样做,我已经查看了关于 SO 的几乎所有其他类似问题,但其中 none 为我提供了关于我做错了什么的任何线索。
这是我的功能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
}
这是函数文件夹中的 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);
});
我不确定我的设置是否有误,或者我是否对 index.js 中的 nodemailer 代码做错了什么。
提前感谢您的帮助。
如评论中所述,由于您的 Cloud Function 是由后台事件触发的,因此您必须 return 承诺以指示异步任务已完成。
因此,在 goMail
函数中,您应该 return 通过 sendMail()
方法使用 return 承诺 return:
...
return transporter.sendMail(mailOptions); //Remove the callback
并且您应该 return,在 Cloud Function 本身中,return 由 goMail
函数编辑的承诺:
return goMail(...)