如果在 NodeJS 中未确认电子邮件,则自动删除 Mongo 文档

问题描述 投票:0回答:2

我在 NodeJS 中有一个使用 Express 和 Mongoose 的有效用户注册系统。在用户创建帐户的那一刻,确认电子邮件将发送到该电子邮件,当单击链接时,它将确认他们的帐户并让他们设置密码。如果用户在 60 分钟内没有确认他们的帐户,我想删除整个 mongo 文档。解决这个问题的最佳方法是什么?

node.js mongodb express mongoose nodemailer
2个回答
1
投票

好吧

mongoose
javascript
包装纸
mongoDB
所以你应该只使用常规
javascript
来做到这一点。

我会利用

pre
钩:

https://mongoosejs.com/docs/middleware.html#pre

我会设置 60 分钟的超时并运行一个

delete
查询到
mongoose
并将您响应
setTimeout
函数获得的计时器 ID 设置为创建的实际文档。

然后,在验证帐户的情况下,我会清除计时器并删除新用户文档中的条目。

如果没有任何反应,文档将以编程方式删除。

schema.pre("save", async function(next) {
  const id = setTimeout(function() {
    const document = await Model.findOne(/* use some unique value with this */);
    await document.remove() 
    }, 3600000);
  this.timerId = id;
  next();
}

然后在验证的情况下运行:

const document = await Model.findOne(/* find the document */);
clearTimeout(document.id);

这应该足以处理整个流程。

请告诉我是否足够! :)


0
投票

不要使用 setTimeout 或 remove 方法(remove 现已弃用)对 mongoose 执行此操作。如果由于某种原因您的服务器出现故障,您可能会失去有效期。另一个原因是您无法使用该解决方案进行横向扩展。在我看来,还有更有效的方法来解决这个问题。

有三种选择:

  1. 利用 MongoDB TTL 您应该做的是创建一个带有 partialFilterIndex 的 TTL 索引,并根据文件的过期时间删除文件,并确保过滤器不会删除已验证的帐户。这将使 mongoDB 为您工作。
  2. 使用像 rabbitMQ 这样的消息队列 对于此解决方案,使用发送定时消息的消息队列。例如,在 rabbitmq 中,您可以在特定时间后设置消息。这将使您的服务器在到期后收到消息,您可以检查它是否已通过验证,如果没有则删除该文档。
  3. Cron 作业批量删除 另一种选择是让 cron 作业在设定的时间(根据您的需要每天或每周)运行,并使用 mongoose 方法删除已过期且尚未确认的文档。
© www.soinside.com 2019 - 2024. All rights reserved.