Implementé el código a continuación y funciona perfectamente bien cuando lo ejecuto en una máquina local con npm start
Sin embargo, cuando lo implemento en Firebase, la función sendOrderEmail no funciona.
Ni siquiera recibo ningún registro.
const functions = require("firebase-functions"); const admin = require("firebase-admin"); const {email, password} = require('./config'); const nodemailer = require('nodemailer'); const htmlToText = require('nodemailer-html-to-text').htmlToText; admin.initializeApp(); const mailTransport = nodemailer.createTransport({ service: 'gmail', auth: { user: email, pass: password } }); mailTransport.use("compile", htmlToText()); const APP_NAME = 'the.Travelest'; exports.sendUserEmail = functions.database .ref("/lettersRequest/{pushId}") .onCreate(request => { return sendOrderEmail(request.val().email); }); async function sendOrderEmail(email){ const mailOptions = { from: `${APP_NAME}`, to: email, subject: `Your order from ${APP_NAME}`, html: ` <div> <strong> Hello </strong> World </div> ` }; return await mailTransport.sendMail(mailOptions); }ACTUALIZAR Después de verificar la lógica, creo que encontré los problemas en otro lugar.
Entonces, la lógica es: cuando hago clic en ENVIAR en el formulario, envío los datos a Firebase Runtime Database. Y esta acción activa la función anterior y envía el correo electrónico.
Sin embargo, el botón ENVIAR no activa el proceso que debería activar. Ni siquiera veo el resultado de console.log en la consola, cuando hago clic en ENVIAR De nuevo, funciona localmente, cuando ejecuto nom start
Aquí está el controlador de envío:
const handleSubmit = event => { event.preventDefault(); setErrors(validate(values)) setIsSubmitting(true) try{ const newRequestRef = database.ref('lettersRequest').push(); const newRequest = { country: values.country, travelersAmount: values.travelersAmount, introExtro: values.introExtro, comments: values.comments, email: values.email, phone: values.phone }; newRequestRef.set({ email: values.email, request: newRequest }); console.log("no error") }catch(e){ console.log("error") } }No está manejando la promesa devuelta por set() . Prueba esto:
const handleSubmit = event => { event.preventDefault(); setErrors(validate(values)) setIsSubmitting(true) const newRequestRef = database.ref('lettersRequest').push(); const newRequest = { country: values.country, travelersAmount: values.travelersAmount, introExtro: values.introExtro, comments: values.comments, email: values.email, phone: values.phone }; newRequestRef.set({ email: values.email, request: newRequest }).then(() => { console.log("Request Added in Database") }).catch(e => console.log(e)); }Si registra 'Solicitud agregada en la base de datos', entonces se ha agregado correctamente y su función debería activarse.
Además, esto también se puede hacer mediante una función invocable , lo que significa que llama a la función directamente desde el cliente, realiza toda la validación, agrega los datos en la base de datos y envía el correo electrónico en lugar de usar activadores de base de datos.
Entonces, el problema fue aún más trivial de lo que podría esperar: D Implementé Firebase, pero nunca comprometí y construí el proyecto ... Como resultado, nada se actualizó después de cada implementación.
Estúpido error