gpt4 book ai didi

node.js - 我需要将旧对象与更新后的对象进行比较,无论是否调用 api

转载 作者:太空宇宙 更新时间:2023-11-04 01:25:31 25 4
gpt4 key购买 nike

我需要将旧对象与更新后的对象进行比较,无论是否调用 API,都可以使用或不使用环回 Hook 或混合。

==> context.currentInstance只能通过prototype.updateAttributes()获得,这与其他(保存/创建等)有点不同,因为当由prototype.updateAttributes()触发“before save”钩子(Hook)时,ctx.data将填充要更改的数据,正如您期望的更新操作一样。这是准备更改的旧数据,我可以将其与更新的数据 context.data 或 context.instance 进行比较。但我在所有情况下都没有得到 currentInstance...

我正在使用环回的“保存前”钩子(Hook)。

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

基于谁在调用我收到的钩子(Hook)函数任何一个ctx.currentInstance(这是oldObject,表示没有变化的数据) + ctx.data(这是updatedObject)或者ctx.instance(这是新数据)

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

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

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

如何获取持久模型的受影响的属性/属性?条件是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)
});

我可以在钩子(Hook)之间传递 ctx.hookState 。因此,在任何环回 Hook 中设置该值都可以。条件是我收到整个对象,而不仅仅是更新的部分。由任何调用触发的任何环回钩子(Hook),例如保存/创建/更新/删除等。

最佳答案

很多情况下,LoopBack没有旧的对象数据。如果您想访问该数据,则必须从“保存前” Hook 中的数据库中获取它。

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

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

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

关于node.js - 我需要将旧对象与更新后的对象进行比较,无论是否调用 api,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57662515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com