我正在使用MEAN堆栈。
例如,在我的angular代码中,我可能有:
Brand.create({name: 'name'}).then(function(brand){
//here, the product's referenced brand._id depends on the Brand response
Product.create({'name':'name', 'category': 'food',
'brand': brand.data._id}).then(function(res){
$scope.product = res.data;
});
});
如果在服务器端这样做会更好吗?如果有人在调用第二个承诺之前刷新或失去连接,似乎只会导致创建一个品牌,而不会创建相关的产品。如果是这样的话,在它们各自的控制器中连接两个不同的集合是不是一个最佳实践?
在服务器端做这个会更好吗?如果有人这样做的话刷新或失去连接之前,第二个承诺调用,似乎会不会只产生一个品牌,而没有关联产品。
是的。出于以下几个原因,最好在服务器端完成:
- 通过网络的Ajax调用越少越好。所以创建一个ajax调用来实现你想要实现的更高级的操作将会更有效率。
- 你的逻辑和错误处理越接近数据源(例如数据库),就越容易可靠地编写和执行事情。
- 你的场景中丢失的网络连接是一个从客户端实现多步数据操作问题的完美例子。
。无论您在哪里编写代码,都需要适当的错误处理,可以通过数据库中的某种事务系统,也可以通过手动错误处理,在后面的操作失败时取消前面的操作,这样即使中间或后面的步骤失败,您也总是得到一个有效的系统。在上面的客户端驱动场景中,您需要Produce.create()
上的.catch()
处理程序,因此如果失败,您可以从前面撤消Band.create()
,以便在出现下游错误时使系统处于适当的状态。注意,如果您从客户端管理多个步骤,那么在面对客户端连接问题时,这几乎是不可能的,但是如果从服务器上完成,则更实用,因为在服务器上出现连接问题的可能性大大降低。