我正在使用猫鼬模式对预钩上的密码进行哈希处理,但是,我为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);
});


如果值存在,则表示某种形式来自表单,因此已被更改,请让我知道这是否对您有用,或者我会进一步研究。

10-06 11:48