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

How do you update a document in KeystoneJS on save click?

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

每当有人在后端更改产品代码时,我想更新文档中的价格和标题。 首先,我尝试在模式上使用 mongoose post 保存挂钩。这导致了无限循环,因为它在保存文档后不断更新并保存文档。 然后我实现了一个布尔值来确保 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 保存挂钩。 有什么方法可以使用 KeystoneJS 后端实现我想要的吗?

找到方法了!

首先使用pre保存钩子来观察产品代码的变化:

let updateProduct = false;

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

然后仅在 post 保存挂钩中更新,当 updateProduct 为真时:

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

对我有用,但似乎仍然没有必要复杂。