如何在保存点击时更新KeystoneJS中的文档?

问题描述 投票:0回答:1

我想在更改另一个字段后更新文档中的特定字段。我有一个产品代码和一些字段,如价格和标题,我从外部API获得。

我想在有人更改后端的产品代码时更新文档中的价格和标题。首先,我尝试在架构上使用mongoose post save钩子。这导致无限循环,因为它在保存文档后不断更新并因此保存文档。然后我实现了一个布尔值,以确保只调用一次post保存钩子,看起来像这样:

let postSaveTriggered = false;

//update our product!
Product.schema.post('save', function(doc, next) {
    if (!postSaveTriggered) {
        postSaveTriggered = true;
        api.product.updateInfo(doc, function() { //this updates the document
            next();
        });
    } else {
        postSaveTriggered = false;
        next();
    }
});

但我只希望在用户实际更改产品代码时触发此功能,而不是在产品一般更新时触发。我也在运行一个cron工作来更新产品的价格,我显然不希望在这种情况下触发post save hook。有没有办法用KeystoneJS后端实现我想要的东西?

node.js mongoose keystonejs
1个回答
2
投票

找到了办法!

首先使用预保存挂钩来监视产品代码中的更改:

let updateProduct = false;

Product.schema.pre('save', function(next) {
    updateProduct = this.isModified('code');
    next();
});

然后只需在updateProduct为true时在post保存挂钩中更新:

Product.schema.post('save', function(doc, next) {
    if (updateProduct) {
        updateProduct = false;
        api.product.updateInfo(doc, function() {
            next();
        });
    } else {
        next();
    }
});

虽然对我有用,但仍然看起来不必要。

© www.soinside.com 2019 - 2024. All rights reserved.