由于 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 递归。因为 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();
});
每当对该模型调用查找时,我想更改 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 递归。因为 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();
});