Node.js / Mongoose-撤消对错误的数据库修改

时间:2019-01-02 07:25:03

标签: javascript node.js express mongoose try-catch

我的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 :(得分:3)

您要寻找的就是交易。

事务是MongoDB 4.0和Mongoose 5.2.0中的新增功能。事务使您可以隔离执行多个操作,如果其中一个操作失败,则可能撤消所有操作。本指南将帮助您开始使用Mongoose进行交易。

有关更多信息,请检查以下链接: https://mongoosejs.com/docs/transactions.html

答案 1 :(得分:2)

您要寻找的是交易:https://mongoosejs.com/docs/transactions.html

在完成操作后手动撤消操作并不能保护您免受所有问题的困扰,因此您不应依赖它。例如,与您所写的完全相同:如果在部分写入(某些数据已写入,有些是注释)之后发生崩溃,然后在您的“回滚”代码期间又崩溃了,那又不会清除所有内容,该怎么办?如果您的代码依赖于绝对干净的数据,那么您就有问题了。您的代码应该能够正确处理部分数据,或者您必须有某种方法来确保您的数据在任何时候都完美无缺。

事务是要走的路,因为它只有在一切正常的情况下才一次提交所有内容。