如何防止猫鼬 save() 创建一些架构默认值?

时间:2021-06-24 23:08:01

标签: node.js mongoose

我有这个模式,它有一个过期时间,作为对无效用户砍伐数据库的反制措施,所以如果用户不进行某些验证,他的帐户将被删除!!如果他验证然后过期被删除,直到现在一切都还好,但是如果用户更改了他的电子邮件(在被激活后),由于某种原因在那个 user.save() 中发生的事情会在已经存在的模型上再次创建过期对象DB 即使用户已经过验证!为什么更改电子邮件会导致此创建发生?我做了另一个操作,只有电子邮件更改会创建此过期我试图通过在更改电子邮件时将过期设置为 null 来防止它发生,但它看起来太尴尬了。 再次感谢您的努力。

const Userschema = new mongoose.Schema(
    {
        User: "",
        Name: "",
        Email: {
            type: 'string',
            require: [true, 'Please provide an Email'],
            unique: true,
            lowercase: true,
            validate: [validator.isEmail, 'please provide a valid email ']
        }// date the the user has been created !!!
        createdAt: {
            type: Date,
            default: Date.now()
        },// exparation is by defult
        expiration: {
            //unique: true,
            type: Date,
            default: Date.now(),
            expires: 60,
        },
    }
);

// removing experation logic if the user does a valid validation ! 
 const update2 = await User.findOneAndUpdate(
            { Email: req.body.Email }, {
            $unset: {
                'expiration': 'expires'
            }
})

// Solution but not clean. 
 const user = await User.findById(req.body.id)
    console.log(user, "useeeeeeeeeeeeeeeer");
    user.Email = newEmail
    user.expiration = ''
    user.save() 

1 个答案:

答案 0 :(得分:0)

  const user = await User.findOneAndUpdate(
        {
            '_id': req.body.id,
        },
        {
            '$set': {
                Email: newEmail
            }
        }, { _id: true, new: true }
    )

这解决了问题仍然是 User.findById 和使用 save() 之间的区别,以及使用 find one 和 update 。

相关问题