我想使用 mongodb 作为数据库为我的 Node js 应用程序创建一个 OTP(一次性密码) 生成 otp 并通过电子邮件发送给客户端后,我想将 otp 作为 hashedOTP 存储在数据库中,并在特定时间(例如 2 分钟)后删除(或过期) 但我遇到了一些问题,我不知道该怎么做 我读过一些关于 TTL 的文章和 mongodb 文档,但我根本不明白它是如何工作的,我猜它只是关于日期类型记录 所以我用 js setTimeout 方法做到了,在小规模下它工作得很好,但因为我没有经验,我不知道它在更大的规模下工作得很好。 这是我制作的模式,我尝试了 hashedOTP 的 expires 和 expiresAfterSeconds 但它不起作用
const adminSchema = new mongoose.Schema({
firstName : {
type : 'string'
},
lastName : {
type : 'string'
},
email : {
type : 'string'
},
password : {
type : 'string'
},
phoneNumber : {
type : 'string'
},
role : {
type : 'string'
},
confirmationToken : {
type : 'string'
},
hasConfirmedEmail : {
type : Boolean,
default : false
},
hashedOTP : {
type : 'string',
}
})
现在第一个问题是将 OTP 保存在数据库中是正确的方法吗? 这是我处理 setTimeout 的代码
try {
const hashedotp = await bcrypt.hash(otp,10)
verifiedAdmin.hashedOTP = hashedotp
await verifiedAdmin.save()
setTimeout(async () => {
console.log('set time out gonna work now ')
verifiedAdmin.hashedOTP = ''
await verifiedAdmin.save()
}, 120000);
我知道没有必要对 otp 进行哈希处理,但我只是这样做了,verifiedAdmi 是我想要为其发送 otp 的用户,并且它是由上述模式创建的 我只是觉得这个 setTimeout 不会正常工作,因为它与数据库有很多交互
如果你想在固定时间(即120000秒)后删除hashedOTP,你可以运行一个cron作业并通过检查createdAt时间来更新集合
1 - 运行 Cron 作业
2 - if(检查时间大于createdAt + 120000秒)则删除 哈希p
const CronJob = require('cron').CronJob;
new CronJob({
cronTime: "00 */5 * * * *", //every five minutes
onTick: function() {
helperFunctionToUpdateData()
},
}),
我更喜欢使用 moment.js 来检查时差
不要删除,而是执行以下操作
创建一个不同的模型,比如说,OtpVerification,其中包含字段 userId(已索引,因为将进行大量搜索)、otp(随机数)和 expiresAt(可以轻松完成当前时间 + 10 分钟)使用矩js)。 然后在验证时在 OTPVerification 中查找是否存在任何具有该 userId 的文档(如果存在)检查 otp 并 if(expiresAt > 当前时间){ 允许 }别的{ 一次性密码已过期 }