2015-01-04 27 views
4

我正在尝试查找对象是否在预保存中更改并相应地执行一些操作。 Followinfg是我的代码查找对象是否在预保存钩子猫鼬中更改

var eql = require("deep-eql"); 

OrderSchema.post('init', function() { 
    this._original = this.toObject(); 
}); 

OrderSchema.pre('save', function(next) { 
    var original = this._original; 

    delete this._original; 
    if(eql(this, original)){ 
     //do some actions 
    } 
    next(); 
}); 

即使我没有改变任何东西,它也会返回false!

+0

可能重复?](http://stackoverflow.com/questions/10487702/does-mongoose-have-an-isdirty-check) –

+0

目前尚不清楚我们如何提供解决方案? – raju

回答

8

首先,您根本不需要original对象。您可以通过thispre钩子中访问它。其次,post挂钩仅在所有pre挂钩执行后才执行,因此您的代码根本没有任何意义(check mongoose docs)。

您可以通过在pre钩子中检查isModified来完成检查,并根本删除post挂钩。

OrderSchema.pre('save', function(next) {  
    if(!this.isModified()){ 
     //not modified 
    } 
    next(); 
}); 

更新

为了检查是否某些属性进行了修改,通过属性名作为参数传递给isModified功能:

if (this.isModified("some-property")) { 
    // do something 
} 
的[不鼬有isDirty检查
+0

是的,通常它是有道理的,但在我的例子中确实this._original不是null。我能够打印this_original并获得旧值! – raju

+0

任何想法如何检查对象变量?例如。 this.something.isModified()给我一个未定义的错误 – andersfylling

+0

@sciencefyll我已经更新了答案 –