我在保存之前实施了#34;"我的代码中的操作挂钩,用于比较要保存的新实例与数据库中已有的旧实例。 为此,我将ctx.data中给出的值与数据库中查询给出的值进行比较。 问题是返回的值总是相似的,就好像新实例已经保存在数据库中一样。 在保存之前我是否完全错过了#34;"钩,还是有办法比较这两个值?
module.exports = function(app) {
var Like = app.models.Like;
Like.observe('before save', function(ctx, next) {
var count = 0;
if (ctx.instance) { // create operation
console.log('create operation);
}
else { // update operation
// Query for the existing model in db
Like.findById(ctx.where.id,
function(err, item) {
if (err)
console.log(err);
else {//compare query value and instance value
if (item.value != ctx.data.value) {
// Always false
}
else {
//Always true
}
}
}
);
}
next();
我无法理解为什么item.value总是类似于ctx.data.value,因为第一个应该是db中的实际值,第二个是要保存的值。
答案 0 :(得分:0)
他们的方式你在底部的next()看起来是正确的,并且可能在findById
调用返回之前给予足够的时间来实际发生保存。拨打next
后,保存实际上可能会发生,因此findById
可以与您的保存竞争。
尝试这样做,next()
位于findById
的回调范围内,这将阻止保存,直到您完成比较为止。
module.exports = function(app) {
var Like = app.models.Like;
Like.observe('before save', function(ctx, next) {
var count = 0;
if (ctx.instance) { // create operation
console.log('create operation);
next();
}
else { // update operation
// Query for the existing model in db
Like.findById(ctx.where.id,
function(err, item) {
if (err)
console.log(err);
else {//compare query value and instance value
if (item.value != ctx.data.value) {
// Always false
}
else {
//Always true
}
}
next();
}
);
}