Node.js / Mongoose - Отмена изменений базы данных при ошибке - PullRequest
0 голосов
/ 02 января 2019

У меня довольно сложный express маршрут на моем node.js сервере, который вносит множество изменений в базу данных с помощью mongoose.

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

Но это довольно уродливо, так как я должен знать, какие были предыдущие значения и что если в блоке catch произойдет ошибка?Особенно сложно отменить эти изменения, когда произошла ошибка во время Promise.all(array.map( /* ... */ ))


Мой маршрут выглядит примерно так:

module.exports = (req, res) => {

    var arr1, var2, var3

    try {

        const body = req.body

        arr1 = await fetchVar1(body)
        const _data = await Promise.all([
            Promise.all(
                arr1.map(async x => {
                    const y = await fetchSometing(x)
                    return doSometing(y)
                })
            ),
            doSomething3(arr1),
        ])
        var2 = _data[1]
        var3 = _data[2]

        return res.json({ arr1, var2, var3 })

    } catch (err) {

        /**
         * If an error occurs I have to undo
         * everything that has been done
         * in the try block
         */

    }
}

Желательно, чтобы я хотелреализовать что-то, что «объединяет» все изменения и «фиксирует» изменения, если ошибок не было.

Ответы [ 2 ]

0 голосов
/ 02 января 2019

То, что вы ищете, называется Транзакциями.

Транзакции являются новыми в MongoDB 4.0 и Mongoose 5.2.0.Транзакции позволяют вам выполнить несколько операций изолированно и потенциально отменить все операции, если одна из них завершится неудачно.Это руководство поможет вам начать использовать транзакции с Mongoose.

Для получения дополнительной информации перейдите по ссылке ниже: https://mongoosejs.com/docs/transactions.html

0 голосов
/ 02 января 2019

То, что вы ищете, это транзакции: https://mongoosejs.com/docs/transactions.html

Удаление вручную вещей после их выполнения не защитит вас от каждой проблемы, поэтому вам не следует полагаться на это. Например, точно так, как вы написали: что произойдет, если после частичной записи произойдет сбой (некоторые данные записаны, некоторые будут записаны), а затем другой сбой во время вашего кода «отката», который не очищает все? Если ваш код зависит от того, насколько чисты ваши данные, у вас есть проблема. Ваш код должен либо правильно обрабатывать частичные данные, либо у вас должен быть какой-то способ гарантировать, что ваши данные всегда будут на хорошем уровне.

Транзакции - это путь, потому что он фиксирует все сразу, если все работает.

...