Javascript 节点js中的电子邮件确认

Javascript 节点js中的电子邮件确认,javascript,node.js,mongoose,Javascript,Node.js,Mongoose,我正在节点js中编写电子邮件确认代码。我采用的方法如下 生成5位随机数 在数据库(mongodb)中保存用户数据(电子邮件、密码等)以及5位随机数 在电子邮件地址上发送随机数 应用setTimeout()方法等待20分钟确认邮件地址 20分钟后,若用户验证addres,则可以从数据库中删除用户数据 但此代码将继续等待20分钟,直到setTimeout期间结束。有没有什么方法可以在不等待20分钟的情况下应用此策略?我知道这很简单,但我无法破解。下面是代码 const emailCode = M

我正在节点js中编写电子邮件确认代码。我采用的方法如下

  • 生成5位随机数
  • 在数据库(mongodb)中保存用户数据(电子邮件、密码等)以及5位随机数
  • 在电子邮件地址上发送随机数
  • 应用
    setTimeout()
    方法等待20分钟确认邮件地址
  • 20分钟后,若用户验证addres,则可以从数据库中删除用户数据
但此代码将继续等待20分钟,直到setTimeout期间结束。有没有什么方法可以在不等待20分钟的情况下应用此策略?我知道这很简单,但我无法破解。下面是代码

const emailCode = Math.floor(Math.random()*90000)+10000;
    try
    {
        const user = new User({...req.body, emailCode});
        req.user = user;
        await user.save()
    }
    catch(err)
    {
        if(err.keyPattern)
        {
            res.status(409).send({err: "User Already Exists"})
        }
        else if(err.errors.email)
        {
            res.status(400).send({err: err.errors.email.message})
        }
        else if(err.errors.password)
        {
            res.status(400).send({err: err.errors.password.message})
        }
        res.status(400).send(err);
    }
    const transporter = nodemailer.createTransport({
        service: 'gmail',
        auth: {
            user: '',
            pass: ''
        }
    });
    const mailOptions = {
        from: '',
        to: req.body.email,
        subject: "Confirm Your Email Address",
        text: "Use the following 5 digit code to confirm your email address \n"+emailCode.toString()
    };
    try
    {
        const mail = await transporter.sendMail(mailOptions);
        console.log("here");
        await new Promise(resolve =>
        {
            setTimeout(resolve, 10000)
        })
        console.log("there");
        console.log(req.user.verify)
        if(!req.user.verify)
        {
            req.user.remove();
        }
    }
    catch(err)
    {
        res.send(err)
    }

在数据库中保存确认代码的过期时间。然后,在验证代码时,还要验证代码是否已过期。

将确认代码的过期时间保存在数据库中。然后,当您验证代码时,也要验证它是否已过期。

我们可以使用MongoDB中的TTL索引来完成这项工作,假设有一个
isVerified
,默认情况下它是
false
,并且在用户验证电子邮件时设置为
true

所以我们可以添加一个TTL索引,如

db.users.createIndex( {createdAt: 1}, {
    expireAfterSeconds: 20*60, // 20 minutes
    partialFilterExpression: {
        isVerified: false
    }
});
此处
createdAt
是用户注册的日期和时间

如果
isVerified
仍然为false,则TTL索引将在过期后自动删除文档


作为参考

我们可以在MongoDB中使用TTL索引来完成这项工作,假设有一个
isVerified
,它默认为
false
,在用户验证电子邮件时设置为
true

所以我们可以添加一个TTL索引,如

db.users.createIndex( {createdAt: 1}, {
    expireAfterSeconds: 20*60, // 20 minutes
    partialFilterExpression: {
        isVerified: false
    }
});
此处
createdAt
是用户注册的日期和时间

如果
isVerified
仍然为false,则TTL索引将在过期后自动删除文档


作为参考

您也可以尝试这种方法

通过使用NPM软件包(两步身份验证)

在你的server index.js中使用这个包并为它创建一个路由,然后直接传入变量,剩下的你就可以做了

在你的应用程序中,从表单中获取数据并将其传递到你的服务器,然后再传递到软件包,它将返回一个OTP供你使用

用法
const{Auth}=require('two-step-Auth');
异步函数登录(emailId){
const res=等待验证(emailId);
//您可以遵循上述方法,但我们建议您遵循以下方法,因为邮件将被视为重要邮件
const res=wait Auth(emailId,“公司名称”);
控制台日志(res);
console.log(res.mail);
控制台日志(res.OTP);
console.log(res.success);
}
常量app=express();
app.get('./auth/mailId/CompanyName',异步(req,res)=>{
const{emailId}=req.params;
const data=登录名(emailId);
})
输出
这将提供一个OTP供您使用,您可以将其保存在服务器中,并用于将来的身份验证,例如当用户在OTP中键入内容时,从前端向服务器发出post请求。您也可以尝试这种方法

通过使用NPM软件包(两步身份验证)

在你的server index.js中使用这个包并为它创建一个路由,然后直接传入变量,剩下的你就可以做了

在你的应用程序中,从表单中获取数据并将其传递到你的服务器,然后再传递到软件包,它将返回一个OTP供你使用

用法
const{Auth}=require('two-step-Auth');
异步函数登录(emailId){
const res=等待验证(emailId);
//您可以遵循上述方法,但我们建议您遵循以下方法,因为邮件将被视为重要邮件
const res=wait Auth(emailId,“公司名称”);
控制台日志(res);
console.log(res.mail);
控制台日志(res.OTP);
console.log(res.success);
}
常量app=express();
app.get('./auth/mailId/CompanyName',异步(req,res)=>{
const{emailId}=req.params;
const data=登录名(emailId);
})
输出
这将为您提供一个OTP供您使用,您可以将其保存在您的服务器中,并用于将来的身份验证,例如当用户在OTP中键入内容时,从前端向您的服务器发送post请求。

如果您提供有关如何发送电子邮件的更多详细信息,将有所帮助(nodemailer?ses?)…@GilsonDoiJunior是nodemailer,我已经更新了这个问题。如果您能提供更多关于您如何发送电子邮件的详细信息(nodemailer?ses?)…@GilsonDoiJunior nodemailer和我已经更新了这个问题。应该有两个不同的端点:一个是生成验证号,并将代码和生成时间保存在数据库中(正如@Brad所说),另一个端点负责检查用户发送的号码是否正确且未过期。这里应该有两个不同的端点:一个用于生成验证号码并将代码和生成时间保存在数据库中(正如@Brad所说),另一个端点负责检查用户发送的号码是否正确且未过期