Node.js 我需要将旧对象与更新对象进行比较,无论是否使用环回挂钩,而不考虑调用api

Node.js 我需要将旧对象与更新对象进行比较,无论是否使用环回挂钩,而不考虑调用api,node.js,mongodb,loopback,Node.js,Mongodb,Loopback,我需要将旧的对象与更新的对象进行比较,不管是否有环回挂钩,或者是否与调用的API进行混合 ==>context.currentInstance仅通过prototype.updateAttributes()可用,它与其他(保存/创建等)稍有不同 当prototype.updateAttributes()触发“保存前”钩子时,ctx.data将填充要更改的数据,正如您对更新操作所期望的那样。这是准备更改的旧数据,我可以将其与更新的数据context.data或context.instance进行比较

我需要将旧的对象与更新的对象进行比较,不管是否有环回挂钩,或者是否与调用的API进行混合

==>context.currentInstance仅通过prototype.updateAttributes()可用,它与其他(保存/创建等)稍有不同 当prototype.updateAttributes()触发“保存前”钩子时,ctx.data将填充要更改的数据,正如您对更新操作所期望的那样。这是准备更改的旧数据,我可以将其与更新的数据context.data或context.instance进行比较。但我并不是在所有情况下都得到currentInstance

我正在使用环回的“保存前”钩子

假设oldObject=更新前的数据。 和updateObject=更新后的数据

根据谁在调用我接收的钩子函数 任何一个 ctx.currentInstance(这是没有更改的旧对象平均数据)+ctx.data(这是UpdateObject) 或 ctx.instance(这是新数据)

案例1 如果对象是新的,则无法进行比较。 if(ctx.instance){//true}

案例2 如果对象被更新了,那么我们可以比较数据并找到更改的属性。 if(ctx.currentInstance&&ctx.data){//true}

现在我的问题与案例2有关。 如果我想找到oldObject和UpdateObject之间的差异,那么我可以使用lodash,也可以使用deep diff(deep diff是一个javascript/node.js模块,提供用于确定对象之间结构差异的实用程序函数,包括一些用于在对象之间应用差异的实用程序)但是,当任何钩子(比如由prototype.updateAttributes()以外的任何东西触发的save钩子之前的钩子)触发时,此解决方案将失败

如何获取持久化模型的受影响属性/属性?条件是在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等。

在许多情况下,环回没有旧的对象数据。如果要访问该数据,必须在“保存前”挂钩中从数据库中获取该数据

一个模型来说明我的观点:

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

请注意,“保存前”钩子也是由更新多个实例的操作触发的(例如,
updateAll
),您也需要处理该情况。

在许多情况下,环回没有旧的对象数据。如果要访问该数据,必须在“保存前”挂钩中从数据库中获取该数据

一个模型来说明我的观点:

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

请注意,“保存前”钩子也是由更新多个实例的操作触发的(例如,
updateAll
),您也需要处理这种情况。

@Geggi632请看这个。@Geggi632请看这个。