我需要将旧对象与更新后的对象进行比较,无论是否调用环回挂钩 api
I need to compare old object with updated object with or without loopback hooks irrespective to the calling api
我需要将旧对象与具有或不具有环回挂钩的更新对象进行比较,或者可能与调用无关 API。
==> context.currentInstance 只能通过 prototype.updateAttributes() 获得,这与其他(save/create 等)有点不同
当由 prototype.updateAttributes() 触发的 'before save' 挂钩时,ctx.data 将填充要更改的数据,正如您对更新操作所期望的那样。这是准备更改的旧数据,我可以将其与更新后的数据 context.data 或 context.instance 进行比较。但是我并没有在所有情况下都获得 currentInstance...
我正在使用 "before save" 环回钩子。
假设 oldObject = 更新前的数据。
和 updatedObject = 更新后的数据。
根据谁在调用我接收的钩子函数
任何一个
ctx.currentInstance(这是 oldObject 表示没有变化的数据)+ ctx.data(这是 updatedObject)
要么
ctx.instance(这是新数据)
案例 1
如果对象是新对象,则无法进行比较。
如果(ctx.instance){//真}
案例2
如果对象被更新,那么我们可以比较数据并找到 属性 发生变化的变化。
如果(ctx.currentInstance && ctx.data){//真}
现在我的查询与案例 2 相关。
如果我想找到 oldObject 和 updatedObject 之间的差异,那么我可以使用 lodash 或者我可以使用 deep-diff(deep-diff 是一个 javascript/node.js 模块,提供实用函数来确定对象之间的结构差异,并包括一些用于跨对象应用差异的实用程序。)但是,当任何钩子在保存钩子之前由 prototype.updateAttributes()
以外的任何东西触发时,此解决方案将失败
如何影响持久模型的 attributes/properties?条件是在 ctx.currentInstance 和 ctx.data.
中接收到整个对象
Model.observe("before save", async function (ctx) {
ctx.hookState.olddata = ctx.data; // or ctx.currentInstance or anyhting that gives the old object (just before updation)
});
我可以在钩子之间传递ctx.hookState。因此,在任何环回挂钩中设置值都可以。条件是我收到了整个对象,而不仅仅是更新的部分。任何呼叫触发的任何环回挂钩说 save/create/update/delete 等
在很多情况下,LoopBack 没有旧的对象数据。如果你想访问该数据,你必须在你的 "before save" 挂钩中从数据库中获取它。
一个模型来说明我的观点:
Model.observe("before save", async function (ctx) {
if (ctx.currentInstance) {
ctx.hookState.oldData = [ctx.currentInstance];
} else if (ctx.isNewInstance) {
// new instance being created, no old data
ctx.hookState.oldData = [];
} else if (ctx.where) {
// updating multiple records via `updateAll`
ctx.hookState.oldData = await ctx.Model.find(ctx.where);
} else {
ctx.hookState.oldData = [await ctx.Model.findById(ctx.instance.id)];
}
});
请注意 "before save" 钩子也会被更新多个实例的操作触发(例如 updateAll
),您也需要处理这种情况。
我需要将旧对象与具有或不具有环回挂钩的更新对象进行比较,或者可能与调用无关 API。
==> context.currentInstance 只能通过 prototype.updateAttributes() 获得,这与其他(save/create 等)有点不同 当由 prototype.updateAttributes() 触发的 'before save' 挂钩时,ctx.data 将填充要更改的数据,正如您对更新操作所期望的那样。这是准备更改的旧数据,我可以将其与更新后的数据 context.data 或 context.instance 进行比较。但是我并没有在所有情况下都获得 currentInstance...
我正在使用 "before save" 环回钩子。
假设 oldObject = 更新前的数据。 和 updatedObject = 更新后的数据。
根据谁在调用我接收的钩子函数 任何一个 ctx.currentInstance(这是 oldObject 表示没有变化的数据)+ ctx.data(这是 updatedObject) 要么 ctx.instance(这是新数据)
案例 1 如果对象是新对象,则无法进行比较。 如果(ctx.instance){//真}
案例2 如果对象被更新,那么我们可以比较数据并找到 属性 发生变化的变化。 如果(ctx.currentInstance && ctx.data){//真}
现在我的查询与案例 2 相关。 如果我想找到 oldObject 和 updatedObject 之间的差异,那么我可以使用 lodash 或者我可以使用 deep-diff(deep-diff 是一个 javascript/node.js 模块,提供实用函数来确定对象之间的结构差异,并包括一些用于跨对象应用差异的实用程序。)但是,当任何钩子在保存钩子之前由 prototype.updateAttributes()
以外的任何东西触发时,此解决方案将失败如何影响持久模型的 attributes/properties?条件是在 ctx.currentInstance 和 ctx.data.
中接收到整个对象Model.observe("before save", async function (ctx) {
ctx.hookState.olddata = ctx.data; // or ctx.currentInstance or anyhting that gives the old object (just before updation)
});
我可以在钩子之间传递ctx.hookState。因此,在任何环回挂钩中设置值都可以。条件是我收到了整个对象,而不仅仅是更新的部分。任何呼叫触发的任何环回挂钩说 save/create/update/delete 等
在很多情况下,LoopBack 没有旧的对象数据。如果你想访问该数据,你必须在你的 "before save" 挂钩中从数据库中获取它。
一个模型来说明我的观点:
Model.observe("before save", async function (ctx) {
if (ctx.currentInstance) {
ctx.hookState.oldData = [ctx.currentInstance];
} else if (ctx.isNewInstance) {
// new instance being created, no old data
ctx.hookState.oldData = [];
} else if (ctx.where) {
// updating multiple records via `updateAll`
ctx.hookState.oldData = await ctx.Model.find(ctx.where);
} else {
ctx.hookState.oldData = [await ctx.Model.findById(ctx.instance.id)];
}
});
请注意 "before save" 钩子也会被更新多个实例的操作触发(例如 updateAll
),您也需要处理这种情况。