我正在使用猫鼬模式对预钩上的密码进行哈希处理,但是,我为isModified
进行的检查是否知道是否应该使用isModified
哈希/重新哈希密码始终会导致错误。
await mongoose.connect(this.connUri, {
useNewUrlParser: true,
useUnifiedTopology: true,
useCreateIndex: true
});
const oldUser = await UserModel.findOne({ name: user.name });
oldUser.name = user.name || oldUser.name;
oldUser.password = user.password || oldUser.password;
oldUser.firstName = user.firstName || oldUser.firstName;
oldUser.lastName = user.lastName || oldUser.lastName;
oldUser.email = user.email || oldUser.email;
oldUser.status = user.status || oldUser.status;
let modified = oldUser.isModified(); // test for seeing if modified or not. Always false
await oldUser.save();
result.status = status;
result.result = oldUser;
await mongoose.disconnect();
将fyi
user
传递到容纳此函数的方法中。我本以为通过更改属性将其标记为isModified === true
,那么如何将isModified
设置为true / false或实际对其进行设置呢?任何提示,建议或建议,不胜感激。也欢迎以其他方式做到这一点,谢谢!编辑-根据评论和建议的类似答案
即使使用指定的对象参数,我的代码仍只显示为
false
而不是true
方法中的isModified()
。因此,建议的问题无济于事,因为它没有回答修改后的属性首先如何设置。如果每个属性都使用
oldUser.set('password', user.password || oldUser.password);
,则该对象将获得isModifed() === true
,但是当直接用document.property = 'some value'
设置该对象时,该对象将不会获得isModified() === true
,而insetad是false
,即使它确实更改属性,并使用.save()
将其保存在数据库中。那么,为什么呢?用猫鼬更新文档的更好方法是什么呢? 最佳答案
我已经从头开始制作了一个完整的工作示例进行测试,您可以在此处找到该存储库:
https://github.com/ZeldOcarina/mongoose-edit-example
主要要点是此处理程序:
app.patch('/user', async (req, res) => {
const { id, username, password } = req.body;
const user = await User.findById(id);
user.username = username ? username : user.username;
user.password = password ? password : user.password;
await user.save();
res.status(200).json(user);
});
如果值存在,则表示某种形式来自表单,因此已被更改,请让我知道这是否对您有用,或者我会进一步研究。