Reactjs Firebase不响应云功能
我正在使用React JS、一个联系人表单和初始化的firebase向实时数据库添加数据。这一切都有效 然而,我正试图实现一个电子邮件发送给我时,一个新的联系方式已经提交。当前的问题:当我提交表单(并且添加了实时数据库)时,云功能还没有部署,什么都没有发生。firebase控制台中甚至没有错误消息 请你看看我的代码,并提供一些建议,如何让我可以自动发送电子邮件Reactjs Firebase不响应云功能,reactjs,firebase,firebase-realtime-database,Reactjs,Firebase,Firebase Realtime Database,我正在使用React JS、一个联系人表单和初始化的firebase向实时数据库添加数据。这一切都有效 然而,我正试图实现一个电子邮件发送给我时,一个新的联系方式已经提交。当前的问题:当我提交表单(并且添加了实时数据库)时,云功能还没有部署,什么都没有发生。firebase控制台中甚至没有错误消息 请你看看我的代码,并提供一些建议,如何让我可以自动发送电子邮件 const functions = require('firebase-functions') const admin = requir
const functions = require('firebase-functions')
const admin = require('firebase-admin');
const nodemailer = require('nodemailer');
admin.initializeApp()
require('dotenv').config()
const email = process.env.REACT_APP_SENDER_EMAIL;
const pass = process.env.REACT_APP_SENDER_PASS;
exports.sendEmailNotification = functions.firestore.document('messages/{id}')
.onCreate((snap, ctx) => {
const data = snap.data();
let authData = nodemailer.createTransport({
host: 'smtp.gmail.com',
port: 465,
secure: true,
auth: {
user: email,
pass: pass
}
});
authData.sendMail({
from: data.email,
to: data.to,
subject: data.name + ' sent a message',
text: data.text,
}).then(res => console.log('email sent')).catch(err => console.log(err));
});
您的函数需要返回一个承诺,该承诺在所有异步工作完成时解析
return authData.sendMail({
from: data.email,
to: data.to,
subject: data.name + ' sent a message',
text: data.text,
})
回报这一承诺让云功能知道何时可以安全地清理并继续工作。我最初也尝试将其创建为firebase云功能,但我转向在服务器上构建NodeEmailer。在使用firebase云功能时,我使用了package.json中降级到node:8的漏洞(该漏洞已被弃用),我被迫制定了Google firebase付费计划。这两件东西都把我逼到了一个我不想进入的角落 这是node.js中nodeEmailer的结果,感谢
const express=require('express'))
require('dotenv').config()
const bodyParser=require('body-parser')
const exphbs=require('express-handlebar'))
const path=require('路径')
const nodemailer=require('nodemailer')
const app=express()
const email_from=process.env.email_from;
const sender_pass=process.env.sender_pass;
const email_to=process.env.email_to;
//查看引擎设置
app.engine('handlebar',exphbs())
应用程序集(“查看引擎”、“把手”)
//体分析器
use(bodyParser.urlencoded({extended:false}));
use(bodyParser.json());
//静态文件夹
app.use('/public',express.static(path.join(\uu dirname,'public'))
应用程序获取(“/”,(请求,请求)=>{
res.render('contact',{layout:false})
})
app.post('/send',(req,res)=>{
常量输出=`
你有一个新的提交
联系方式
- 名称:${req.body.Name}
- 公司:${req.body.Company}
- 电子邮件:${req.body.Email}
- 电话:${req.body.Phone}
消息
${req.body.message}`;
异步函数main(){
//从ethereal.email生成测试SMTP服务帐户
//仅当您没有用于测试的真实邮件帐户时才需要
//让testAccount=等待NodeEmailer.createTestAccount();
//使用默认SMTP传输创建可重用的传输对象
让transporter=nodeEmailer.createTransport({
主机:“smtp.ethereal.email”,
港口:587,
安全:false,//对于465为true,对于其他端口为false
认证:{
用户:电子邮件地址:,
通行证:发送者通行证
},
});
//使用定义的传输对象发送邮件
let info=wait transporter.sendMail({
发件人:电子邮件地址:,
致:电邮至:,
主题:“Dean Productions提交的新资料!”,
文本:“新提交”,
html:输出,
});
console.log(“发送的消息:%s”,info.messageId);
//已发送的消息:
//预览仅在通过Ethereal帐户发送时可用
log(“预览URL:%s”,nodeEmailer.getTestMessageUrl(info));
//预览URL:https://ethereal.email/message/WaQKMgKddxQDoou...
res.render('contact',{layout:false,msg:'Message has sent!'})
}
main().catch(console.error);
})
app.listen(3000,()=>console.log('服务器已启动…'))
console记录snap和ctx参数,并在此处显示{“@type”:“type.googleapis.com/google.cloud.audit.AuditLog”,“status”:{},“authenticationInfo”:{“principalEmail”:“james”_ross@outlook.fr“},”serviceName:“cloudfunctions.GoogleAppis.com”,“methodName:“google.cloud.functions.v1.CloudFunctionsService.CreateFunction”,“resourceName”:“projects/react-website-afe39/locations/us-central1/functions/sendmailnotification”}这是在Firebase上的控制台日志中返回的所有信息,您的控制台是什么?snap还是ctx?我做了console.log(snap,ctx);
const express = require('express')
require('dotenv').config()
const bodyParser = require('body-parser')
const exphbs = require('express-handlebars')
const path = require('path')
const nodemailer = require('nodemailer')
const app = express()
const email_from = process.env.EMAIL_FROM;
const sender_pass = process.env.SENDER_PASS;
const email_to = process.env.EMAIL_TO;
// View engine setup
app.engine('handlebars', exphbs())
app.set('view engine', 'handlebars')
//body parser
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
//static folder
app.use('/public', express.static(path.join(__dirname, 'public')))
app.get('/', (req, res) => {
res.render('contact', { layout: false })
})
app.post('/send', (req, res) => {
const output = `
<p>You have a new submission</p>
<h3>Contact Details</h3>
<ul>
<li>Name: ${req.body.name}</li>
<li>Company: ${req.body.company}</li>
<li>Email: ${req.body.email}</li>
<li>Phone: ${req.body.phone}</li>
</ul>
<h3>Message</h3>
<p> ${req.body.message} </p> `;
async function main() {
// Generate test SMTP service account from ethereal.email
// Only needed if you don't have a real mail account for testing
// let testAccount = await nodemailer.createTestAccount();
// create reusable transporter object using the default SMTP transport
let transporter = nodemailer.createTransport({
host: "smtp.ethereal.email",
port: 587,
secure: false, // true for 465, false for other ports
auth: {
user: email_from,
pass: sender_pass
},
});
// send mail with defined transport object
let info = await transporter.sendMail({
from: email_from,
to: email_to,
subject: 'New Submission from Dean Productions!',
text: 'new submission',
html: output,
});
console.log("Message sent: %s", info.messageId);
// Message sent: <b658f8ca-6296-ccf4-8306-87d57a0b4321@example.com>
// Preview only available when sending through an Ethereal account
console.log("Preview URL: %s", nodemailer.getTestMessageUrl(info));
// Preview URL: https://ethereal.email/message/WaQKMgKddxQDoou...
res.render('contact', { layout: false, msg: 'Message has been sent!' })
}
main().catch(console.error);
})
app.listen(3000, () => console.log('Server started...'))