介绍
我的应用程序中有不同的功能,比如:
- 重置密码(忘记密码)
- 更新用户密码
- 注册
- 成为溢价
对于每个功能,如果成功,我想向用户发送一封自定义HTML邮箱.
邮箱的产生
由于HTML的主要 struct 是相同的(只有内容(文本)发生了变化),我决定实现我的助手方法generateEmailTemplate()
:
const { HEAD, BODY } = require("../utils");
module.exports = (main) => `
<!DOCTYPE html>
<html lang="en">
${HEAD}
${BODY(main)}
</html>
`;
为了将特定数据包含到生成的模板中,我对每个功能使用了不同的方法:
const signUpWelcomeEmailTemplate = (name) =>
templateGenerator(`<p>Welcome, ${name}</p>`);
const premiumEmailTemplate = (name) =>
templateGenerator(`<h1>${name}, you are now premium!</h1>`);
// The html is more complex, I have reduced it for simiplicity
发送邮箱
为了向用户发送邮箱,我有以下方法,将邮箱记录添加到我的数据库中.然后,当添加记录时,连接到MailGun
服务的自定义扩展通过SMTP发送邮件.
这是我的方法的实现:
async function sendEmail(
to,
subject,
text = undefined,
html = undefined
) {
const mailsRef = db.collection("mails");
const mail = {
to,
message: {
subject,
...text && { text },
...html && { html },
},
};
await mailsRef.add(mail);
functions.logger.log("Queued email for delivery!");
};
问题
现在,为了使用这种方法,在每个功能中,我必须执行以下操作:
async function goPremium(user) {
try {
await purchasePremium(user.uid);
const html = premiumEmailTemplate(user.name);
sendEmail(user.email, "Premium purchase success!", undefined, html);
} catch(err) {
...
}
}
我在寻找一种模式来概括这个电话,我的意思是,某种邮箱管理器.
我考虑过两种不同的方法来重构代码:
#1(我不喜欢这种方式,因为这个方法可能会很长,我的意思是,想象100个特征…)
function emailManager(user, type) {
switch(type) {
"welcome":
sendEmail(user.email, "Welcome!", undefined, welcomeEmailTemplate(user.name));
break;
"premium":
sendEmail(user.email, "Premium purchase success!", undefined, premiumEmailTemplate(user.name));
break;
default:
break;
}
}
- 只需创建不同的方法,并将其从"中心"模块导出即可.
...
const sendPremiumEmail = (user) => {
const title = "Premium purchase success!";
const html = premiumEmailTemplate(user.name);
return sendEmail(user.email, title, undefined, html);
};
...
module.exports = {
sendWelcomeEmail,
sendPremiumEmail,
...
}
但是也许还有另一种方式,一种模式可以解决这种情况.有什么 idea 吗?