Javascript 如何在带有节点的mongoose中使isModified为true

Javascript 如何在带有节点的mongoose中使isModified为true,javascript,node.js,mongodb,typescript,mongoose,Javascript,Node.js,Mongodb,Typescript,Mongoose,我使用mongoose模式在预钩子上散列密码,但是,我对isModified所做的检查是否应该使用isModified散列/重新散列密码总是导致false wait mongoose.connect(this.connUri{ useNewUrlParser:true, useUnifiedTopology:正确, useCreateIndex:true }); const-oldUser=await-UserModel.findOne({name:user.name}); oldUser.na

我使用mongoose模式在预钩子上散列密码,但是,我对
isModified
所做的检查是否应该使用
isModified
散列/重新散列密码总是导致false

wait mongoose.connect(this.connUri{
useNewUrlParser:true,
useUnifiedTopology:正确,
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;
让modified=oldUser.isModified();//测试是否修改。总是假的
等待oldUser.save();
结果。状态=状态;
result.result=oldUser;
等待猫鼬。断开连接();
一个fyi
用户
被传递到包含此信息的方法中。我本以为通过更改属性,它会被标记为
isModified===true
,那么如何将
isModified
设置为true/false,或者是什么实际设置了它?任何提示、建议或建议都将不胜感激。打开一个不同的方式做这件事太,谢谢!
编辑-基于评论和建议的类似答案

即使使用指定的对象参数,我的代码仍然仅在
isModified()
方法中显示为
false
,而不是
true
。因此,建议的问题没有帮助,因为它没有回答修改后的属性最初是如何设置的


如果使用
oldUser.set('password',user.password | | oldUser.password)
对于每个属性,对象都会得到
isModified()==true
但是,当您直接使用
document.property='some value'
设置它时,对象不会得到
isModified()==true
,但是insetad是
false
,即使它确实更改了属性,并将使用
.save()
将其保存在数据库中。那么这是为什么呢?用mongoose更新文档的更好方法是什么?

解决方案是为什么不使用conditional about Change属性。例如,如果您想检查密码
是否修改如下:

oldUser.pre('save', function(next) {                                                                                                                                   
  if(oldUser.password && oldUser.isModified('password')){                                                                                                                                                                                                                                                                                      
    this.password  = bcrypt.hashSync(oldUser.password, bcrypt.genSaltSync(8),null);                                                                                                             
  }
next() });  

我从零开始制作了一个完整的工作示例来测试这一点,您可以在这里找到回购协议:

主要的外卖是这个处理程序:

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);
});

如果某个值存在,则表示某个值来自表单,因此该值发生了更改,请告诉我该值是否适用于您,或者我会对此进行深入研究。

请检查文档,您可以选择路径(属性)或整个文档@Teukumulaichsan感谢您的回答,但这无助于解决根本问题。不幸的是,即使指定path属性,isModified()也始终为false。这里唯一没有得到的是连接字符串。如何在函数外部使用
wait
?你连接正确吗?@MattiaRasulo包含代码段的方法是异步的,因为mongoose是为此而设置的,所以你可以等待查询。这是否回答了你的问题@MattiaRasulo没有,但是谢谢分享。@MattiaRasulo我更新了问题的细节。有了这些,你能解释为什么会发生这种情况,哪种方法更好吗?我喜欢你在作业中使用三元。当用户名被更改时,isModified()会给你什么?我遇到的问题是,当一个属性被更新时,文档应该为isModified()返回true,但它不是。是的,我知道。你已经要求其他方法来检查,这可能是一个!它适合你的需要吗?