创建一个 express 中间件来发送电子邮件

Creating an express middleware to send emails

我一直在尝试制作一个快速中间件,在之前的中间件完成后使用 Nodemailer 发送电子邮件。我想出了几个不同的设计,但最终每个不同的版本都有它的缺点。

最终,我希望中间件能够得到之前中间件的响应。如果成功,则发送成功邮件,否则发送错误邮件。

我想出了一个双重设计,其中一个变体推送到错误中间件,成功导致下一个中间件。这包含发送多个 headers 的一些小问题,特别是在第二个中间件错误上。我可以说,如果邮件出错,什么都不做。但这似乎不对。如果有人对好的设计有任何建议,那就太好了。

根据您的描述,我建议不要为此创建不同的中间件,而只是创建一个通用的电子邮件功能来处理不同类型的消息。然后,只需在第一个中间件中使用该函数并根据用例传递不同的参数 (success/error).

email-controller.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);
    });

  })

}

custom-router.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;