flo*_*olu 3 javascript try-catch mongoose node.js express
我的服务器中有一个相当复杂的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
*/
}
}
Run Code Online (Sandbox Code Playgroud)
最好我想实现一些“批量”所有更改并在没有发生错误的情况下“提交”更改的东西。
您正在寻找的是交易:https : //mongoosejs.com/docs/transactions.html
完成后手动撤消不会保护您免受所有问题的影响,因此您不应该依赖于此。例如,正如您所写的那样:如果在部分写入后发生崩溃(一些数据被写入,有些没有),然后在您的“回滚”代码期间发生另一次崩溃,这不会清除所有内容,会发生什么?如果您的代码依赖于您的数据绝对干净,那么您就有问题了。您的代码应该能够正确处理部分数据,或者您必须有某种方法来保证您的数据始终完美无缺。
事务是要走的路,因为它只在一切正常时立即提交所有内容。