由于 Access/Loaded Hook 的上下文对象 (LoopBack3) 中缺少模型实例,无法更改所需的属性值

Unable to alter desired attribute value due to missing model instance in Access/Loaded Hook's context objects(LoopBack3)

每当对该模型调用查找时,我想更改 someModel 中的属性。由于我不能使用远程 Hooks,因为 find 不是远程方法,而是内置的,并且在操作钩子中 find/findOne 仅触发访问和加载钩子,并且根据我的研究,它们不会 return他们的 ctx 中的模型实例(或者如果他们这样做,我想知道在哪里),我想做类似的事情:

modelName.observe('loaded', function (ctx, next) {
      ctx.someModel_instance.updateAttribute(someCount, value
            ,function(err, instance){
             if (err) next(err)
                else{
                      console.log("done")
                 }

      });


} 

解决方法: 由于 loaded 不是 return 模型实例,而是 return ctx.data,其中 return 是模型中数据的副本,如果您碰巧在您的模型中有一个唯一的 ID,因此您可以通过 findById 获取模型实例,并且可以持久地 access/alter 所述模型的属性。例如:

modelName.observe('loaded', function (ctx, next) {
        modelName.findOne({
          where: {id : ctx.data.id},
          },function(err, someModel_instance){
                    if (err) next(err)
                    else{   
                        someModel_instance.updateAttribute(someCount,value
                            , function(err, instance){
                                console.log(done)
                        });     
                        }
                });
                next();
} );

这可以解决问题,但问题是它导致的 non-stop 递归。因为 findOneupdateAttribute 将再次触发 loaded hook 等等。这可以通过使用 ctx.options 字段来解决,该字段就像一个空容器,可用于存储标志。例如:

modelName.observe('loaded', function (ctx, next) {
    if(ctx.options && !ctx.options.alreadyFound){

        modelName.findOne({
          where: {id : ctx.data.id},
          },{alreadyFound = true}, function(err, someModel_instance){
                    if (err) next(err)
                    else{   
                        someModel_instance.updateAttribute(someCount,value
                            ,{alreadyFound = true}, function(err, instance){
                                console.log(done)
                        });     
                        }
                });

    }
    next();
});