如何在特定时间后删除集合的记录

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

我想使用 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 不会正常工作,因为它与数据库有很多交互

node.js database mongodb settimeout ttl
2个回答
1
投票

如果你想在固定时间(即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 来检查时差


0
投票

不要删除,而是执行以下操作

创建一个不同的模型,比如说,OtpVerification,其中包含字段 userId(已索引,因为将进行大量搜索)、otp(随机数)和 expiresAt(可以轻松完成当前时间 + 10 分钟)使用矩js)。 然后在验证时在 OTPVerification 中查找是否存在任何具有该 userId 的文档(如果存在)检查 otp 并 if(expiresAt > 当前时间){ 允许 }别的{ 一次性密码已过期 }

© www.soinside.com 2019 - 2024. All rights reserved.