【问题标题】:Node.js / Mongoose - Undo Database Modifications on ErrorNode.js / Mongoose - 撤消数据库修改错误
【发布时间】:2019-05-28 21:13:14
【问题描述】:

我的node.js 服务器中有一个相当复杂的express 路由,它通过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
         */

    }
}

最好我想实现“批量”所有更改并在没有发生错误时“提交”更改。

【问题讨论】:

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


    【解决方案1】:

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

    在执行完操作后手动撤消操作并不能保护您免受所有问题的影响,因此您不应依赖它。例如,正如您所写的那样:如果在部分写入后发生崩溃(某些数据已写入,有些则未写入),然后在您的“回滚”代码期间发生另一次崩溃,这不会清除所有内容?如果您的代码依赖于您的数据绝对干净,那么您就有问题了。您的代码应该能够正确处理部分数据,或者您必须有某种方式来保证您的数据始终完美无缺。

    事务是要走的路,因为如果一切正常,它只会一次提交所有内容。

    【讨论】:

    【解决方案2】:

    您要查找的内容称为事务。

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

    欲了解更多信息,请查看以下链接: https://mongoosejs.com/docs/transactions.html

    【讨论】:

    猜你喜欢
    • 2010-09-30
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-16
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多