Как вы обновляете документ в KeystoneJS при нажатии кнопки «Сохранить»?

Я хочу обновить определенные поля в документе после изменения другого поля. У меня есть код продукта и несколько полей, таких как цена и название, которые я получаю из внешнего API.

Я хочу обновлять цену и название в документе всякий раз, когда кто-то изменяет код продукта в бэкэнде. Сначала я попытался использовать крючок для сохранения сообщений мангуста в схеме. Это привело к бесконечному циклу, поскольку он продолжал обновлять и, таким образом, сохранять документ после сохранения документа. Затем я реализовал логическое значение, чтобы хук сохранения записи вызывался только один раз, что выглядит примерно так:

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 для обновления цен на продукты, и я, очевидно, не хочу, чтобы в этом сценарии вообще срабатывал хук для сохранения сообщений. Есть ли способ добиться того, чего я хочу, используя бэкэнд KeystoneJS?


person Ezeke    schedule 02.01.2018    source источник


Ответы (1)


Нашел способ!

Сначала используйте хук pre для сохранения, чтобы следить за изменениями в коде продукта:

let updateProduct = false;

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

Затем просто обновите хук сохранения post только тогда, когда updateProduct имеет значение true:

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

Работает для меня, но все еще кажется ненужным сложным.

person Ezeke    schedule 03.01.2018