创建一个 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;
我一直在尝试制作一个快速中间件,在之前的中间件完成后使用 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;