Javascript 节点js中的电子邮件确认
我正在节点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
- 生成5位随机数
- 在数据库(mongodb)中保存用户数据(电子邮件、密码等)以及5位随机数
- 在电子邮件地址上发送随机数
- 应用
方法等待20分钟确认邮件地址setTimeout()
- 20分钟后,若用户验证addres,则可以从数据库中删除用户数据
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所说),另一个端点负责检查用户发送的号码是否正确且未过期