环回节点js中的循环更新

时间:2018-05-19 17:23:26

标签: node.js loopbackjs

在环回中我需要处理Patch in循环。 每当我尝试修补属性时,我可能必须更新表/集合中的一个或所有其他记录中的属性。我一直在使用before save挂钩并调用updateInLoop,如下所示更新其他记录。

module.exports = function(Model) {
    Model.observe('before save', async(ctx, next) => {
        if(ctx.Data) {
             updateInLoop(ctx.Data, Model);
        }
    });
}

const updateInLoop = async function(data, Model) {
    var modelDbData = await Model.find();
    for(let entity in modelDbData) {
        if(entity.property > threshold){
            entity.property = entity.property + 1;
            await Model.upsert(model);
        }
    }
}

如果updateInloop中的循环不能运行多次,这似乎工作正常。每当循环需要运行多次时,代码似乎没有按预期工作。

我发现意外行为是由于循环中的每个更新操作都执行了before save挂钩。怎么解决这个问题?

1 个答案:

答案 0 :(得分:0)

这种行为是绝对可以预期的,如果你可以轻松识别你的增量语句,你可以阻止它自己调用。

module.exports = function(Model) {
    Model.observe('before save', async(ctx) => {
        // if(ctx.Data) {


        let keys = ctx.Data ? Object.keys(ctx.Data) : undefined;
        // It is an increment if the length of its keys is 1 and that the key is property
        let isIncrement = (keys && keys.length === 1 && keys[0] === 'property');

        if (ctx.Data && !isIncrement) {
            updateInLoop(ctx.Data, Model);

        }
    });
}

const updateInLoop = async function(data, Model) {
    var modelDbData = await Model.find();
    for(let entity in modelDbData) {
        if(entity.property > threshold){
            // entity.property = entity.property + 1;
            // await Model.upsert(model);

            await Model.updateById(entity.id, {property: entity.property + 1});
        }
    }
}