javascript - 无法使用 Firebase 云功能发送电子邮件
问题描述
创建 Firestore 文档后无法发送电子邮件。创建 firestore 上的文档后,我正在尝试向 webapp 管理员的电子邮件发送通知电子邮件。但是面临以下问题。
index.js
const functions = require('firebase-functions');
const admin = require("firebase-admin")
const nodemailer = require('nodemailer');
admin.initializeApp()
//google account credentials used to send email
var transporter = nodemailer.createTransport({
host: 'smtp.gmail.com',
port: 465,
secure: true,
auth: {
user: '*****@gmail.com',
pass: '******'
}
});
exports.sendEmail = functions.firestore
.document('stories/{sId}')
.onCreate((snap, context) => {
const mailOptions = {
from: `*******@gmail.com`,
to: snap.data().email,
subject: 'contact form message',
html: `<h1>Order Confirmation</h1>
<p>
<b>Email: </b>${snap.data().email}<br>
</p>`
};
return transporter.sendMail(mailOptions, (error, data) => {
if (error) {
return res.send(error.toString());
}
var data = JSON.stringify(data)
return res.send(`Sent! ${data}`);
});
});
Firebase 函数日志
*sendEmail 结算帐户未配置。外部网络无法访问,配额受到严格限制。配置结算帐户以删除这些限制
sendEmail 函数返回未定义、预期的 Promise 或值*
我假设忽略日志中的计费消息是安全的,因为它不是强制性的计费计划?
任何帮助将非常感激。
解决方案
错误消息告诉您,您的代码根据要求返回了承诺或值以外的内容。问题是你使用的方式transporter.sendMail()
。根据nodemailer 文档,如果你不传递回调方法(你正在sendMail
做的)只会返回一个承诺,否则它会返回 undefined。所以你的函数返回未定义。
您应该做的是删除回调参数,而是处理返回的承诺的结果。您还可以从函数返回承诺。
return transporter.sendMail(mailOptions)
.then(data => {
// decide what you want to do on success
})
.catch(err => {
// decide what you want to do on failure
});
推荐阅读
- camera - 基于 i.MX6 ULL 的设备有时无法打开 USB 摄像头
- lua - 寻找一种在 lua/luajit 中创建压缩 png 文件的方法
- relational-algebra - 求自然连接的基数
- uitableview - 静态表视图标题的更改颜色不起作用
- python - 如何解析字符串索引在数据分析中必须是整数?
- sql - 选择带有分区的最低销售额的产品
- vue.js - Nuxt Auth 两个本地端点
- python - 在大理石迷宫游戏中移动大理石
- c# - 在 Unity 中加载场景会使该场景中的引用为空
- javascript - 如何在 highchart 中使用 CSS 设置文本注释样式