Strongloop : 在操作挂钩中比较旧模型和新实例 'before save'

Strongloop : Compare old model with the new instance in operation hook 'before save'

我在我的代码中实现了一个 "before save" 操作挂钩,以将要保存的新实例与数据库中已有的旧实例进行比较。 为此,我将 ctx.data 中给出的值与数据库中查询给出的值进行比较。 问题是返回的值总是相似的,就好像新实例已经保存在数据库中一样。 我是否完全错过了 "before save" 钩子的要点,或者有没有办法比较这两个值?

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 因为第一个应该是数据库中的实际值,第二个应该是将要保存的值.

他们将 next() 放在底部的方式似乎不正确,可能会在 findById 调用 returns 之前为实际发生的保存提供足够的时间。一旦你调用 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();
            }
        );
    }