在开发 Web 应用时,我们经常需要存储一些临时数据,例如用户的登录状态、验证码等。这些数据有一个共同的特点,就是它们都有一个有效期,在有效期过后就不再有用,甚至有可能会带来安全风险。为了避免这种情况的发生,我们可以使用 TTL(Time To Live)机制来自动删除过期数据。在 MongoDB 中,我们可以使用 mongoose-ttl 插件来实现这个功能。
安装 mongoose-ttl
首先,我们需要安装 mongoose-ttl 插件。在终端中执行以下命令:
npm install mongoose-ttl --save
使用 mongoose-ttl
使用 mongoose-ttl 很简单,我们只需要在定义 Schema 时添加 expires 字段,指定数据的有效期即可。例如,我们要存储一个验证码,有效期为 5 分钟,可以这样定义 Schema:
// javascriptcn.com 代码示例 const mongoose = require('mongoose'); const ttl = require('mongoose-ttl'); const VerificationCodeSchema = new mongoose.Schema({ code: { type: String, required: true }, phone: { type: String, required: true }, createdAt: { type: Date, default: Date.now }, expires: { type: Date, default: Date.now, expires: '5m' } }); VerificationCodeSchema.plugin(ttl); const VerificationCode = mongoose.model('VerificationCode', VerificationCodeSchema); module.exports = VerificationCode;
在上面的代码中,expires 字段指定了数据的有效期为 5 分钟。mongoose-ttl 插件会自动将这个字段转换为 TTL 索引,当数据过期时自动删除。
示例代码
下面是一个完整的示例,演示了如何使用 mongoose-ttl 存储验证码,并在过期后自动删除:
// javascriptcn.com 代码示例 const mongoose = require('mongoose'); const ttl = require('mongoose-ttl'); const VerificationCodeSchema = new mongoose.Schema({ code: { type: String, required: true }, phone: { type: String, required: true }, createdAt: { type: Date, default: Date.now }, expires: { type: Date, default: Date.now, expires: '5m' } }); VerificationCodeSchema.plugin(ttl); const VerificationCode = mongoose.model('VerificationCode', VerificationCodeSchema); mongoose.connect('mongodb://localhost/test', { useNewUrlParser: true, useUnifiedTopology: true }) .then(() => { console.log('Connected to MongoDB'); const code = Math.floor(Math.random() * 1000000).toString().padStart(6, '0'); const phone = '13800138000'; const verificationCode = new VerificationCode({ code, phone }); verificationCode.save().then(() => { console.log(`Verification code ${code} saved`); setTimeout(() => { VerificationCode.findOne({ code, phone }).then((doc) => { if (doc) { console.log(`Verification code ${code} still exists`); } else { console.log(`Verification code ${code} has been deleted`); } mongoose.disconnect(); }); }, 60000); }); }) .catch((err) => { console.error(err); });
在上面的代码中,我们先连接到 MongoDB,然后生成一个 6 位数的验证码,并存储到数据库中。然后等待 1 分钟后,再查询该验证码是否还存在。由于验证码的有效期为 5 分钟,如果它还存在,说明自动删除功能没有生效。如果它已经被删除,说明自动删除功能生效了。
总结
使用 mongoose-ttl 插件可以很方便地实现 TTL 自动删除过期数据的功能。在实际开发中,我们可以将它应用于各种临时数据的存储,提高应用的安全性和可靠性。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65692c2ed2f5e1655d1b9546