我在我的node.js应用程序中使用此方案进行会话
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
// define the schema for our user session model
var UserSessionSchema = new Schema({
sessionActivity: { type: Date, expires: '15s' }, // Expire after 15 s
user_token: { type: String, required: true }
});
module.exports = mongoose.model('UserSession', UserSessionSchema);
我在我的应用中创建了一个“会话”:
...
var session = new Session();
session.user_token = profile.token;
session.save(function(save_err) {
if (save_err) {
....
} else {
// store session id in profile
profile.session_key = session._id;
profile.save(function(save_err, profile) {
if (save_err) {
...
} else {
res.json({ status: 'OK', session_id: profile.session_id });
}
});
...
问题是文件永久存在,永不过期。它应该只能活15秒(最多一分钟)。我的代码有什么问题?我试图将expries:字符串设置为数字,即15,字符串为“15s”,依此类推。
答案 0 :(得分:7)
var UserSessionSchema = new Schema({
sessionActivity: { type: Date, expires: '15s', default: Date.now }, // Expire after 15 s
user_token: { type: String, required: true }
});
TTL索引删除文档' x'在其值(应该是日期或日期数组)之后的秒数已经过去。每分钟检查一次TTL,因此它的寿命可能会超过给定的15秒。
要将日期设为默认值,您可以使用Mongoose中的default
选项。它接受一个功能。在这种情况下,Date()
返回当前时间戳。这会将日期设置为当前时间一次。
你也可以走这条路:
UserSessionSchema.pre("save", function(next) {
this.sessionActivity = new Date();
next();
});
这会在每次时更新值.save()
(但不是.update()
)。
答案 1 :(得分:0)
要仔细检查已在DB中创建的索引,可以在mongo shell db.yourdb.getIndexes()
中运行此命令。更改索引时,必须先在集合中手动删除它,然后新的索引才会生效。点击此处了解更多信息Mongoose expires property not working properly