He estado tratando de crear un middleware rápido que envíe un correo electrónico usando Nodemailer después de que finalice el middleware anterior. Se me ocurrieron algunos diseños diferentes, pero en última instancia, cada versión diferente tiene su inconveniente.
En última instancia, me gustaría que el middleware tuviera una respuesta del middleware anterior. Si es un éxito, envíe un correo electrónico de éxito; de lo contrario, envíe un correo electrónico de error.
Se me ocurrió un diseño dual en el que una variación conduce a un middleware de error y un éxito conduce al siguiente middleware. Esto contiene algunos problemas leves de envío de múltiples encabezados, específicamente en un segundo error de middleware. Podría decir, si el correo falla, no hagas nada. Pero eso no parece correcto. Si alguien tiene alguna sugerencia sobre un buen diseño, sería genial.
Por lo que describió, sugeriría no crear un middleware diferente para eso, sino simplemente crear una función de correo electrónico genérica que maneje diferentes tipos de mensajes. Luego, simplemente use esa función en el primer middleware y pase diferentes parámetros según el caso de uso (éxito/error).
controlador de correo electrónico.js
const nodemailer = require('nodemailer'); const transporter = nodemailer.createTransport({ host: process.env.EMAIL_HOST, port: process.env.EMAIL_PORT, secure: true, auth: { user: process.env.SMTP_USER, pass: process.env.SMTP_PASSWORD, }, }); exports.send_email_message = (send_to, subject, message) => { return new Promise((resolve, reject) => { const email_message = { from: { name: process.env.EMAIL_FRIENDLY_NAME }, to: send_to, subject: subject, text: message }; transporter.sendMail(email_message).then(() => { resolve(true); }).catch((error) => { reject(false); }); }) }enrutador personalizado.js
const { send_email_message } = require('./email-controller'); const express = require('express'); const router = express.Router(); router.get('/custom-middleware', async (req, res, next) => { try { // You can calculate "success" variable based on your custom logic if(success){ await send_email_message('example@gmail.com', 'Success', 'This is body of success message.'); return res.status(200).json({ success: true }); } else { await send_email_message('example@gmail.com', 'Error', 'This is body of error message.'); return res.status(400).json({ success: false }); } } catch(error) { return res.status(400).json({ success: false }); } }); module.exports = router;