Strongloop:在保存之前将旧模型与操作钩子中的新实例进行比较'

时间:2015-03-28 23:29:01

标签: loopbackjs strongloop

我在保存之前实施了#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中的实际值,第二个是要保存的值。

1 个答案:

答案 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();
            }
        );
    }