首页 > 解决方案 > API请求后如何正确发送电子邮件?

问题描述

我正在用 node.js 构建一个 express api。我想在用户创建帐户后发送电子邮件。我已经尝试了几种方法,但它们似乎不符合我的需要,这里有一些伪代码:

1. 通过在路由“末尾”发送电子邮件的功能。 基本上,只需在创建用户帐户的路由末尾调用发送电子邮件的函数:

app.post("/users", (req, res) => {
  const { email, password } = req.body;
  // create user...
  sendEmailTo(email);
}

我对这种方法的担忧是 /POST users 路由现在不再只是用于创建用户,而且每次创建用户时它也会发送一封电子邮件,这对于我们想要创建一个未来的用例可能是不利的用户与用户注册表单分开。

2. 有专门用于发送电子邮件的独特路线。在这种情况下,我们必须向 api 发出两个请求,一个用于创建用户,另一个用于发送电子邮件:

app.post("/send", (req, res) => {
  const { recipientEmail } = req.body;
  sendEmailTo(recipientEmail);
}

我不喜欢这种方法的是我的 api 不是“电子邮件” api,我想让所有用户免费探索和使用,我不希望用户只能发送电子邮件通过请求此路由代表 api。

我确信一定有其他方法可以做到这一点,比如使用某种类型的回调或队列,但我没有发现几个小时的研究,一切基本上都是对上述两个选项的排练。考虑到关注点分离的需要,您将如何在请求后继续发送电子邮件?我只有这两个选项吗?

标签: javascriptnode.jsapiexpressemail

解决方案


正如我在评论中提到的,您可以将您的路由处理程序拆分为更细粒度的中间件,这些中间件可以在您的所有路由中重用。

路由级中间件与路由处理程序非常相似,不同之处在于它实际上只是做一些更专注的工作,然后将当前正在处理的请求转发到下一个中​​间件或路由处理程序。它使用nextexpress 注入的额外函数参数来执行此操作。

在您的场景中,您可以执行以下操作:

app.post(
  "/users", 
  createUser,
  sendEmail,
  send201Response
)

async function createUser(req, res, next) {
  // Create user...
  ​next();
}
​async function sendEmail(req, res, next) {
  // Send email...
  ​next();
​}
function send201Response(req, res) {
  ​res.sendStatus(201);
}

然后,如果另一个用例碰巧涉及以类似方式创建用户,您可以这样做:

app.post(
  "/otherendpoint", 
  createUser,
  // Add other middleware/route handlers...
)

推荐阅读