Невозможно изменить требуемое значение атрибута из-за отсутствия экземпляра модели в объектах контекста Access / Loaded Hook (LoopBack3) - PullRequest
0 голосов
/ 26 июня 2019

Я хочу изменить атрибут в someModel всякий раз, когда для этой модели вызывается поиск. Поскольку я не могу использовать удаленные хуки, так как find не является удаленным методом, а скорее встроенным, а в операционных хуках find / findOne только инициирует доступ и загруженные хуки, и, как показывают мои исследования, они не возвращают экземпляр модели в свои ctx ( или если они это сделают, я хотел бы знать, где), я хочу сделать что-то вроде:

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

      });


} 

1 Ответ

0 голосов
/ 27 июня 2019

Работа вокруг: Так как loaded не возвращает экземпляр модели, но он возвращает ctx.data, в котором он возвращает копию данных в вашей модели, если у вас есть уникальный ID в вашей модели, так что вы можете выбрать экземпляр модели с помощью findById и может постоянно получать доступ / изменять атрибут указанной модели. например:

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

Это сработает, но проблема будет в непрерывной рекурсии, которую она вызывает. Поскольку findOne и updateAttribute снова вызовут 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();
});
...