我有一個身份驗證系統,用戶需要在創建帳戶后驗證他們的電子郵件,然后帳戶的狀態將從 Pending 更改為 Active。
我想實作一個功能,如果用戶在一段時間內沒有驗證他們的電子郵件,該帳戶將被洗掉。我可以通過在 Schema 中設定 expire 欄位來完成洗掉部分:
const userSchema = new mongoose.Schema<IUser>(
{
email: {
type: String,
required: true,
},
status: {
type: String,
default: "Pending",
required: true,
},
expiresAt: {
type: Date,
default: () => Date.now() 30 * 1000,
expires: 30
}
},
{
timestamps: true
}
但是,即使我故意洗掉了該欄位,過期計數器似乎仍在計數expiresAt,并且檔案仍然被洗掉。
const user = await User.findById(tokenId).exec();
user.status = 'Active';
user.expiresAt = undefined;
const updatedUser = await user.save();
我想知道有沒有辦法在驗證后完全停止或洗掉 TTL 功能?
uj5u.com熱心網友回復:
這實際上是mongoose模式提供的一項功能,您實際上并沒有洗掉該expiresAt值,mongoose模式忽略了該輸入,因為它與型別不匹配。
通過查看mongoose源代碼,我們可以看到:
檔案:{ status: "Active", expiredAt: undefined }
const keys = Object.keys(obj);
let i = keys.length;
while (i--) {
key = keys[i];
val = obj[key];
if (obj[key] === void 0) {
delete obj[key];
continue;
}
}
運算式obj[key] === void 0意味著如果obj[key] === undefined像您的情況一樣,基本上mongoose會從更新正文中洗掉此值。
你想要做的只是使用像這樣的運算子$unset:
db.collection.updateOne({ _id: user._id}, {$set: {status: "Active"}, $unset: {expiresAt: ""}})
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/522469.html
下一篇:Pyspark找到最近的文本
