我这里有2个模型user
和blog
。因此,当用户编写博客时,我的路由器会像这样调用它们。
Promise.all([
node.save(),
user.save()
]).then(function (values) {
//do something
}).catch(function (err) {
//print error
})
正如您可能立即注意到的那样,save()
无法保证。其中任何一个都可能失败,其余的都没有回滚。如何确保它们都被保存或回滚?有些人建议将blogs
集合放在users
内,以便所有内容都在一个文档中,但是很难做博客排名,不是吗?我也不确定将所有内容整合到MongoDB中是否真的是一种很好的做法。如果文件很大,是否会导致性能问题(比如请求/秒)?
感谢。
答案 0 :(得分:2)
你不能使用Promise.all,你必须单独链接你的承诺。
node.save().then(user.save).then(function(){//do something else});
你还需要更加努力地工作,以获得像Promise.all一样的数组中的所有实体。但你真的需要吗?您已经可以访问用户和节点实体。
执行此操作的经典方法是使用async和series:
async.series({
node: node.save,
user:user.save
}, function(err, res){
// res is now equal to: {node:node, user:user}
});
大多数人根本不会使用Mongo进行两阶段提交。如果你真的需要这个,也许你使用的是错误的工具。
如果 节点 保存失败,则不会保存 用户 。如果在未保存用户的情况下无法保存节点,请颠倒操作的顺序。如果两者都必须更新,我可能会重新考虑我的数据模型。
如果你真的需要两阶段提交,你需要重新发明那个特定的轮子。在documentation中有一个配方。或者你可以试试其中一个声称要做的猫鼬插件。