Node.js 部署了用于NodeEmailer的Firebase功能,但没有日志,无法正确使用数据库
我已经设置了一个带有nodeEmailer的firebase函数来从我的 firebase数据库已连接到我的联系人表单并通过电子邮件发送到我的电子邮件 我已经成功部署了该功能,并且可以在firebase控制台中看到该功能,但是我在控制台中没有收到任何错误,也没有在控制台的功能部分中看到任何日志或信息。现在根本不起作用 这是我第一次这样做,我已经研究了几乎所有其他类似的问题,但是没有一个能给我任何关于我做错了什么的线索 这是my functions package.json:Node.js 部署了用于NodeEmailer的Firebase功能,但没有日志,无法正确使用数据库,node.js,firebase,firebase-realtime-database,google-cloud-functions,nodemailer,Node.js,Firebase,Firebase Realtime Database,Google Cloud Functions,Nodemailer,我已经设置了一个带有nodeEmailer的firebase函数来从我的 firebase数据库已连接到我的联系人表单并通过电子邮件发送到我的电子邮件 我已经成功部署了该功能,并且可以在firebase控制台中看到该功能,但是我在控制台中没有收到任何错误,也没有在控制台的功能部分中看到任何日志或信息。现在根本不起作用 这是我第一次这样做,我已经研究了几乎所有其他类似的问题,但是没有一个能给我任何关于我做错了什么的线索 这是my functions package.json: { "name"
{
"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
}
这是functions文件夹中的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代码是否有问题
提前感谢您的帮助。如评论中所述,由于您的云功能是由后台事件触发的,因此您必须返回一个承诺以指示异步任务已完成 因此,在
goMail
函数中,您应该返回由sendMail()
方法返回的承诺,包括:
...
return transporter.sendMail(mailOptions); //Remove the callback
您应该在云函数本身中返回由goMail
函数返回的承诺,包括:
return goMail(...)
你是如何触发函数的?很好的问题Frank,很抱歉我是一个noob,但我不太确定我是否执行了触发,我只是在看github上firebase团队的另一个这样做的例子,看到了一个关于他们如何根据数据库中的更改触发函数的部分,但就我自己而言,我有点迷失了方向。请你给我指出正确的方向好吗?谢谢。----我的数据库在每个集合中收集了4个不同的输入,每个集合都有一个“消息”的引用。听起来你对云功能相当陌生,在这种情况下,获取一个像你发现的那样复杂的样本并试图使其工作可能有点太多了。在
/emails
下创建节点时,会触发onDataAdded
功能,并希望新节点具有email
属性,即您要发送给用户的消息正文。除了Frank的建议,我想补充一点,因为您的云函数是由后台事件触发的,所以您必须返回一个承诺来指示异步任务已经完成。在您的情况下,这意味着您应该返回由transporter.sendMail()
返回的承诺(如果没有回调(),节点邮件程序将返回承诺)。返回承诺是关键,正如Firebase视频系列:Good catch Renaud!中关于“JavaScript承诺”的3个视频中所解释的那样!谢谢你们,弗兰克和雷诺你们帮了大忙。我得到了一切我想要的工作方式,并在顶部学习。