Javascript Node.js/Mongoose-错误时撤消数据库修改

Javascript Node.js/Mongoose-错误时撤消数据库修改,javascript,node.js,express,mongoose,try-catch,Javascript,Node.js,Express,Mongoose,Try Catch,在我的node.js服务器中有一个相当复杂的express路由,它通过mongoose对数据库进行许多修改 我的目标是实现一种机制,在发生任何错误时恢复所有更改。我的想法是实现撤消到catch块的函数 但是这很难看,因为我必须知道前面的值是什么,如果catch块中发生错误怎么办?当在Promise.all(array.map(/*…*/) 我的路线与此类似: module.exports = (req, res) => { var arr1, var2, var3 t

在我的
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
         */

    }
}

我希望实现“批量”所有更改,并在未发生错误时“提交”更改的功能。

您需要的是事务:

在完成这些操作后手动撤消这些操作并不能保护您免受所有问题的影响,所以您不应该依赖于此。例如,与您编写的完全相同:如果在部分写入之后发生崩溃(一些数据被写入,一些数据没有写入),然后在“回滚”代码期间发生另一次崩溃,这不会清除所有内容,会发生什么情况?如果您的代码依赖于您的数据是绝对干净的,那么您就有问题了。您的代码应该能够正确处理部分数据,或者您必须有某种方法来保证您的数据在任何时候都是完美的


事务是一种方式,因为只有在一切正常的情况下,它才能一次提交所有内容。

您要查找的内容称为事务

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

有关更多信息,请查看以下链接:

你知道这里发生了什么吗??我不明白,这就是这个问题的链接。非常感谢!这正是我需要的!你知道这里发生了什么吗?